boingboing
Goto Top

Ubuntu (Unix) Dateiauflistung nach Änderungsdatum

Hi Leute, ich habe Probleme einen gewissen Unix-Befehl mit den richtigen Parametern zu finden.
System: Ubuntu 12.04

Ich habe einen Ordner
/home/webdev

In diesem Ordner sind zig Unterordner mit jeweils weiteren Unterordnern (usw.)
Insgesamt befinden sich knapp 15.000 Dateien im webdev (und tiefer)

Ich möchte nun eine Liste (z.B. als Textdatei) die mir alle Dateien auflisten (mit kompletten Pfad)
welche nach einem Datum X geändert wurden. (nicht erstellt sondern geändert)

Aber irgendwie haperts da bei mir.

Also die Ausgabe sollte den Dateinamen (mit kompletten Dateipfad) enthalten, wann sie geändert wurde und die Liste sollte nach Ordner und Namen sortiert sein, so dass man anhand der Liste schön die Ordnerstruktur per Hand durchlaufen kann und die Entsprechenden Dateien sofort findet.

vielen Dank an euch !

Content-ID: 185302

Url: https://administrator.de/contentid/185302

Ausgedruckt am: 25.11.2024 um 01:11 Uhr

Cthluhu
Cthluhu 22.05.2012 um 13:00:37 Uhr
Goto Top
Hallo,

Hast du schon den Befehl "find" versucht? Da gibt es einige parameter atime, mtime, ctime, cmin,... welche sich sicher an deine Bedürfnisse anpassen lassen.

mfg

Cthluhu
Alchimedes
Alchimedes 22.05.2012 aktualisiert um 13:16:48 Uhr
Goto Top
Hallo ,

das riecht nach find.
Also als Bspl. find /dein/pfad -type f -mtime 0 > deinedatei.txt
findet alle geanderten Dateien der letzten 48 std. und lenkt das Ergebnis in deinedatei.txt.

Hier mal ein Paar Examples


Find everything in your home directory modified in the last 24 hours:

find $HOME -mtime -1

Find everything in your home directory modified in the last 30 min

find $HOME -mmin -30

Find files in your home directory that were NOT been modified a year or more:

find $HOME -mtime +365

man find ist dein Freund

Sortiert wird automatisch, moechtest Du aber bestimmten sort option nutzen musst du den Krempel pipen.

find /dein/pfad -type f -mtime 0 | sort -f > deinedatei.txt

man sort zeigt Dir alle Optionen dazu an ..


Gruss
Boingboing
Boingboing 22.05.2012 um 14:09:37 Uhr
Goto Top
dank euch zwei vielmals ^^
werd es nachher mal genau ausprobieren
Arano
Arano 22.05.2012 aktualisiert um 16:45:46 Uhr
Goto Top
Hallo

arano@debian:~$ ls | grep arano
arano@debian:~$ touch arano
arano@debian:~$ ls | grep arano
-rw-r--r--  1 arano arano         0 22. Mai 16:26 arano
arano@debian:~$ stat ./arano
  File: „./arano“
  Size: 0         	Blocks: 0          IO Block: 4096   reguläre leere Datei
Device: 900h/2304d	Inode: 6688420     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/   arano)   Gid: ( 1000/   arano)
Access: 2012-05-22 16:26:43.104153778 +0200
Modify: 2012-05-22 16:26:43.104153778 +0200
Change: 2012-05-22 16:26:43.104153778 +0200
arano@debian:~$ 
arano@debian:~$ 
arano@debian:~$ 
arano@debian:~$ touch arano
arano@debian:~$ ls -l | grep arano
-rw-r--r--  1 arano arano         0 22. Mai 16:29 arano
arano@debian:~$ stat ./arano
  File: „./arano“
  Size: 0         	Blocks: 0          IO Block: 4096   reguläre leere Datei
Device: 900h/2304d	Inode: 6688420     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/   arano)   Gid: ( 1000/   arano)
Access: 2012-05-22 16:29:57.992157237 +0200
Modify: 2012-05-22 16:29:57.992157237 +0200
Change: 2012-05-22 16:29:57.992157237 +0200
arano@debian:~$ 
Also SO ist die Unterscheidung zwischen Creationtime und Changetime nicht feststellbar.
Zeitstempel von Dateien - (inupedia.org)
Zudem ist zu bedenken das es die Creationtime erst mit neuen Dateisystemen gibt - soweit ich weiß. Ext4 kann dies bereits nur hängt die sonstige Software hinterher ! Weder mein Nautilus, noch ls oder find bieten entsprechenden Optionen
How to get firle creation time - (linuxquestions.org)
arano@debian:~$ sudo debugfs -R 'stat <6688420>' /dev/md0  
debugfs 1.41.12 (17-May-2010)
Inode: 6688420   Type: regular    Mode:  0644   Flags: 0x80000
Generation: 536187346    Version: 0x00000000:00000001
User:  1000   Group:  1000   Size: 0
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 0
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x4fbba2e5:ec8c78d4 -- Tue May 22 16:29:57 2012
 atime: 0x4fbba2e5:ec8c78d4 -- Tue May 22 16:29:57 2012
 mtime: 0x4fbba2e5:ec8c78d4 -- Tue May 22 16:29:57 2012
crtime: 0x4fbba223:18d50ac8 -- Tue May 22 16:26:43 2012
Size of extra inode fields: 28
EXTENTS:
arano@debian:~$ 

Aber frage mich jetzt nicht wie ich das in eine sortierte Liste bekomme !


~Arano
64748
64748 22.05.2012 um 19:54:45 Uhr
Goto Top
Guten Abend,
Zitat von @Boingboing:
...
Also die Ausgabe sollte den Dateinamen (mit kompletten Dateipfad) enthalten, wann sie geändert wurde und die Liste sollte
nach Ordner und Namen sortiert sein, so dass man anhand der Liste schön die Ordnerstruktur per Hand durchlaufen kann und die
ich würde das mit
du -h --time
machen. Dabei kannst Du überlegen, ob Du mit awk nach dem Datum sortieren lässt. Allerdings möchtest Du ja eine Sortierung nach Ordnern.

Markus
Alchimedes
Alchimedes 22.05.2012 um 22:28:48 Uhr
Goto Top
Hallo Arano,

guter Beitrag!

dein ls ueber grep gibt Dir auch die Dateiattribute aus? Braucht ls dafuer nicht die option -l?
Oder hast Du Dir ein Alias gesetzt? face-smile


So zum Thema: Du aenderst eine leere Datei! daher findet stat auch keine Aenderungen!


hab ich mal mit nem script getestet.
per copy paste.. weil die stat ausgabe bei mac os fuer nen a.... ist.


File: „./afor1“
Size: 378 Blocks: 8 IO Block: 4096 reguläre Datei
Device: 807h/2055d Inode: 2103246 Links: 1
Access: (0744/-rwxr--r--) Uid: ( 1000/ Alchimedes) Gid: ( 1000/ ich )
Access: 2012-05-22 22:06:10.486208151 +0200
Modify: 2012-02-14 17:16:20.925154513 +0100
Change: 2012-02-14 17:16:20.975153639 +0100

touch afor1

File: „./afor1“
Size: 378 Blocks: 8 IO Block: 4096 reguläre Datei
Device: 807h/2055d Inode: 2103246 Links: 1
Access: (0744/-rwxr--r--) Uid: ( 1000/ Alchimedes) Gid: ( 1000/ ich)
Access: 2012-05-22 22:06:10.486208151 +0200
Modify: 2012-02-14 17:16:20.925154513 +0100
Change: 2012-05-22 22:08:42.277458445 +0200 <-- face-smile

Gruss
Arano
Arano 23.05.2012 um 07:55:10 Uhr
Goto Top
Hallo Alchimedes

*hehe* Nein, mein ls gibt mir auch erst mit der Option "-l" die Dateiattribute aus.
Ich habe das nur versehentlich gelöscht als ich das etwas anschaulicher gestaltet habe. Denn in meinem Beispiel lautet der Dateiname ja wie mein Username, wodurch mir mit dem grep ALLE meine Dateien im Homer-Verzeichnis angezeigt wurden bzw. keine Datei ausgefiltert werden konnten.
Das eigentliche Kommando war
ls -l | grep " arano$"  
Aber darüber sollte sich keiner Gedanken machen - sollte ^^

Naja, stat liest doch auch nur die informationen aus dem Dateisystem aus und tut nichts vergleichen.

Egal, im ganzen wollte ich ja nur aufzeigen, das die ctime, wie oft geglaubt (mich eingeschlossen), nicht die "Erstellungszeit", sondern die Changeteime !
Denn der Fragesteller wollte ja nur die geänderten Dateien, die neu erstellten ausgeschlossen.


~Arano
64748
64748 23.05.2012 um 08:14:00 Uhr
Goto Top
Guten Morgen allerseits face-smile
Zitat von @Arano:
Egal, im ganzen wollte ich ja nur aufzeigen, das die ctime, wie oft geglaubt (mich eingeschlossen), nicht die
"Erstellungszeit", sondern die Changeteime !
Denn der Fragesteller wollte ja nur die geänderten Dateien, die neu erstellten ausgeschlossen.
wenn man du benutzt, dann kann man zwischen verschiedenen Zeiten unterscheiden, hier der Abschnitt der Manpage zu du
Zitat aus "man du"
--time=WORD
              show time as WORD instead of modification time: atime, access, use, ctime or status
Auch find unterscheidet zwischen accesstime und "last change of status".
Ach ja, und hier in der Manpage zu ls finde ich, das es auch die verschiedenen Zeiten unterscheidet
Zitat aus "man ls"
--time=WORD
              with -l, show time as WORD instead of modification time: atime -u, access  -u,  use
              -u, ctime -c, or status -c; use specified time as sort key if --sort=time
Markus
Boingboing
Boingboing 23.05.2012 um 08:59:19 Uhr
Goto Top
Zitat von @Arano:
Denn der Fragesteller wollte ja nur die geänderten Dateien, die neu erstellten ausgeschlossen.
~Arano


Oh Verzeihung, ich glaube da habe ich mich falsch ausgedrückt. Natürlich möchte ich auch die ab dem Zeitpunkt neuerstellen Dateien mit aufgelistet haben.

Vielleicht sollte ich meine Situation ein wenig mehr erläutern.

Ich habe einen Stagingserver (Ubuntu 12.04 LAMPP) auf dem sich die gespiegelte Entwicklungsumgebung des Livesystems meiner Software befindet.

Z.B auf dem Live-Server läuft die stabile Version 2.0.2 meiner Software die am 18.05.2012 deployed wurde.

So, da ich ja auf der Entwicklungsumgebung schon an der z.B 2.0.3 arbeite, ändern sich da dort die Dateien ab dem 18.05.2012. Wenn ich nun zufrieden bin mit der Arbeit und die 2.0.3 auf das Live-System ausrollen möchte könnte ich nun hergehen und den gesamten Entwicklungsordner nehmen und auf den Live-Server schieben. Das Problem ist, durch die ganzen Bilder und hassu nich gesehen schiebe ich da gut und gerne mal 5 oder 6 GB unnötig durch die Gegend.

Also dachte ich, es gäbe vielleicht ein Befehl welche mir alle ab dem Stichtag (z.B. 18.05.2012) veränderten oder neuerstellten Dateien mit Pfadangabe anzeigt. Dann könnte ich eine Zipdatei mit dem selben Pfadschema erstellen und die "zu patchenden" Dateien dan rein knüppeln.

Auf eine Quellcodeverwaltung ala GIT oder Subversion o.Ä. habe ich bewusst verzichtet, da der Overhead durch die Verwaltung und Pflege nicht im Verhältnis steht für eine Software die von nur zwei (bzw Hauptsächlich mir) entwickelt / gewartet wird.
mak-xxl
mak-xxl 23.05.2012 aktualisiert um 09:29:55 Uhr
Goto Top
Moin Boingboing,

nachdem Du nun beschrieben hast, was Du eigentlich willst, kannst Du das mal lesen. Es geht dort, kurz gesagt, um Hardlinks aktualisierter Dateien und Verzeichnisse auf eine Hauptsicherung - das Ganze mit 'rsync' und 'cp'. Mit 'rsync' allein kommst Du nicht zum Ziel, da die '--times'-Parameter nur bei bereits vorhandenem Zielverzeichnis greifen.

Viel Erfolg und freundliche Grüße von der Insel - Mario
Arano
Arano 23.05.2012 um 09:33:43 Uhr
Goto Top
Hi,

achso, dann sollte dir ja ein find /projektX -ctime X reichen.
Das kannst du dann z.B. in eine Datei umleiten lassen und hast
  1. Ein kleines "Updatelog" und
  2. Kannst du diese Liste zum erstellen des Archives verwenden z.B. tar -cf upd.tar --create-from-file=/upd.lst Naja, so ungefähr jedemfalls, habe die genaue Option jetzt nicht im Kopf.


~Arano
Boingboing
Boingboing 23.05.2012 um 09:41:04 Uhr
Goto Top
Danke Arano, genau DAS habe ich gesucht.
Arano
Arano 25.05.2012 um 19:58:14 Uhr
Goto Top
Oh ohhh... oO

Hi,

mir fällt da gerade etwa ein, etwas wichtiges !
Das funktioniert so zwar wunderbar und macht auch einen guten Eindruck ABER... so fällt Datenmüll an !
Mit dieser Methode können logischerweise nur die Dateien Beachtung finden, die auch existieren. Was ist aber mit denen die schön gelöscht wurden, weil sie z.B. nicht mehr gebraucht werden oder zwei ähnliche Dateien zu einer neuen Zusammengelegt wurden.
Diese kann find dir natürlich nicht auflisten, und mit einem vermeidlichem Update werden ja auch nur Dateien von "testing" zu "stabel" kopiert - gelöscht wird nirgends !

Diese find | tar Kombination benutze ich für mein Systembackup. Hier kann ich allerdings monatlich nach dem Vollbackup die "vollbackup.liste" mit dem aktuellem Filesystem abgleichen und eine Differenzliste erstellen lassen diff nach der "aufgeräumt" werden kann (könnte).
Das schiebe ich schon seit Monaten vor mich her...


Schönes Wochenende
~Arano
Boingboing
Boingboing 26.05.2012 aktualisiert um 09:20:58 Uhr
Goto Top
Danke Arano für den Hinweis, ich werde mir dann einfach Notizen machen wenn eine Datei nicht mehr benötigt wird, aber um das kam bis jetzt seltener vor.

Bin sehr zufrieden mit dem find Befehl. Bin halt kein Linux Mensch. Entwickelt wird auf Microsoft Produkten. Das Geschäftsumfeld besteht fast ausschließlich aus Microsoftmaschinen, bis halt auf diesen einen Staging LAMPP Server.
Cthluhu
Cthluhu 26.05.2012 um 09:26:42 Uhr
Goto Top
Hi Arano,

Da möchte ich noch anmerken, dass rsync mit der Option "--delete" dazu benutzt werden kann, Dateien aus dem Zielverzeichnis zu entfernen, welche nicht mehr im Quellverzeichnis sind. Mit --exclude können dabei auch Dateien ausgelassen werden.

mfg

Cthlhu