Wie kann ich mit 'suchen' nach Dateien suchen, die an einem bestimmten Datum erstellt wurden? [geschlossen]

254

Wie verwende ich den UNIX-Befehl find, um nach Dateien zu suchen, die an einem bestimmten Datum erstellt wurden?

sverrejoh
quelle
8
Es scheint, als wären Bash-Scripting-Fragen erlaubt.
Alan
@ MichaelScheper: Ich weiß nicht einmal, wo ich mit diesem Kommentar anfangen soll.
Leichtigkeitsrennen im Orbit
1
@Notinlist: Hier ist die Antwort: meta.stackexchange.com/questions/10249/… Leider hat sich herausgestellt, dass ein Zeitlimit abgelaufen ist. Schade, da hier immer noch Websuchen landen und die akzeptierte Antwort für viele Menschen hilfreich war.
Michael Scheper
@MichaelScheper: Wenn Sie eine Option zum Abstimmen für die Migration zu unix.stackexchange.com finden, weisen Sie mich auf jeden Fall darauf hin. Da Sie nicht den Repräsentanten haben, um den geschlossenen Dialog zu sehen, gebe ich Ihnen einen Hinweis: Es gibt keinen. Seien Sie weniger kämpferisch, wenn Sie keine Ahnung haben, wovon Sie sprechen. Danke für Ihre Aufmerksamkeit.
Leichtigkeitsrennen im Orbit
5
@LightnessRacesinOrbit: Ich entschuldige mich dafür, dass ich als "kämpferisch" rübergekommen bin. Ich darf meine Kommentare nicht bearbeiten, aber war es mein Kommentar, der die Frage lobte, die Sie beleidigt hat? Ich muss sagen, ich fühle mich ein bisschen blind, auch nachdem ich Ihrem vorherigen Kommentar den Vorteil des Zweifels gegeben habe. Ich habe tatsächlich versucht, konstruktiver zu sein, als ein weiteres "Ich auch" hinzuzufügen, indem ich nachgeschlagen habe , wie die Migration funktioniert: meta.stackexchange.com/a/10250/249555 Das 60-Tage-Zeitlimit verbirgt diese Option vielleicht? Entschuldigung für die Pennersteuerung. Nochmals vielen Dank - aufrichtig - für Ihre Zeit und Aufmerksamkeit.
Michael Scheper

Antworten:

323

Wie Max betont hat, ist dies nicht möglich, aber das Überprüfen von Dateien, auf die geändert wurde oder auf die zugegriffen wird, ist nicht allzu schwierig. Ich habe noch heute ein Tutorial darüber geschrieben. Das Wesentliche davon ist zu verwenden -newerXYund ! -newerXY:

Beispiel: So finden Sie alle Dateien, die am 7. Juni 2007 geändert wurden:

$ find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08

So finden Sie alle Dateien, auf die am 29. September 2008 zugegriffen wurde:

$ find . -type f -newerat 2008-09-29 ! -newerat 2008-09-30

Oder Dateien, deren Berechtigung am selben Tag geändert wurde:

$ find . -type f -newerct 2008-09-29 ! -newerct 2008-09-30

Wenn Sie die Berechtigungen für die Datei nicht ändern, entspricht 'c' normalerweise dem Erstellungsdatum.

Arve
quelle
7
Meine Version von find (GNU 4.2.32) scheint die Prädikate -newerXY nicht zu unterstützen. Gibt es eine bestimmte Mindestversion? Oder handelt es sich um das Kompilieren von find mit einem speziellen Konfigurationsschalter?
Yukondude
1
@yukondude: Du hast recht. Die Version von find, die ich lokal habe - GNU 4.4.0 - hat sie, während 4.1.20, die ich auf Dreamhost habe, dies nicht tut. Der Kludge beim Erstellen von zwei Dateien sollte jedoch in beiden funktionieren.
Arve
1
Auf einigen Systemen (FreeBSD, OS / X ...) -newerBtstimmt die Geburtszeit (Erstellungszeit) der Datei überein .
Stephane Chazelas
3
Beachten Sie, dass das -newerxtauf FreeBSD seit 2001 verfügbar ist (wo es erstmals 1998 als Patch bereitgestellt wurde ), einige andere BSDs und GNU-Fundstücke (seit 4.3.3 im Jahr 2007), basierend auf dem HP / UX-Fund, das eingeführt wurde -newerXY(aber wo) Y == t wird nicht unterstützt).
Stephane Chazelas
Mit: find (GNU findutils) 4.4.0 funktioniert diese Syntax unter SUSE ext3 nicht. Wenn an diesem Datum Dateien / w mtime
aufgelistet werden sollen
68

find location -ctime time_period

Beispiele für time_period:

  • Vor mehr als 30 Tagen: -ctime +30

  • Vor weniger als 30 Tagen: -ctime -30

  • Vor genau 30 Tagen: -ctime 30

Chris
quelle
7
Das Problem ist, dass ich für ein bestimmtes Datum testen möchte, nicht innerhalb eines bestimmten Zeitraums.
Sverrejoh
1
Finden Sie heraus, wie viele Tage das her ist, und verwenden Sie diese Nummer.
jmanning2k
15
ctimehat nichts mit der Erstellungszeit zu tun , es ist die Inode-Änderungszeit.
Stephane Chazelas
47

Es sind zwei Schritte, aber ich mache es gerne so:

Erstellen Sie zuerst eine Datei mit einem bestimmten Datum / einer bestimmten Uhrzeit. In diesem Fall ist die Datei 2008-10-01 um Mitternacht

touch -t 0810010000 /tmp/t

Jetzt können wir alle Dateien finden, die neuer oder älter als die obige Datei sind (nach Änderungsdatum der Datei. Sie können auch -anewer für den Zugriff verwenden und -cnewer den Dateistatus ändern).

find / -newer /tmp/t
find / -not -newer /tmp/t

Sie können Dateien auch zwischen bestimmten Daten anzeigen, indem Sie zwei Dateien mit Berührung erstellen

touch -t 0810010000 /tmp/t1
touch -t 0810011000 /tmp/t2

Dadurch werden Dateien zwischen den beiden Daten und Zeiten gefunden

find / -newer /tmp/t1 -and -not -newer /tmp/t2
Mark Biek
quelle
3
+1 für die Lösung eines älteren, finddem es fehlt-newerXY
Felipe Alvarez
1
IMO, im Moment sollte dies die akzeptierte Lösung sein. Ich konnte -newermt nicht auf dem Kernel 2.6.18-348.18.1.el5 ausführen, geschweige denn auf neueren Kerneln.
DarkForce
Gleich hier, DarkForce, scheint die Newermt-Funktionalität sehr, sehr wackelig zu sein
niken
34

Sie könnten dies tun:

find ./ -type f -ls |grep '10 Sep'

Beispiel:

[root@pbx etc]# find /var/ -type f -ls | grep "Dec 24"
791235    4 -rw-r--r--   1 root     root           29 Dec 24 03:24 /var/lib/prelink/full
798227  288 -rw-r--r--   1 root     root       292323 Dec 24 23:53 /var/log/sa/sar24
797244  320 -rw-r--r--   1 root     root       321300 Dec 24 23:50 /var/log/sa/sa24
Jeff MacDonald
quelle
Dies ist, was die meisten Leute wollen, aber es hat nicht genug Upvotes erhalten !!!
Sjas
2
Dies funktioniert möglicherweise nicht, wenn sich einige Millionen Dateien in einem Verzeichnis befinden.
Dennis Nolte
3
Es gibt Nebenwirkungen, wenn der Grep-Suchbegriff im Dateinamen enthalten ist.
Snorex
mywiki.wooledge.org/ParsingLs - Ein besserer Ansatz besteht wahrscheinlich darin, das Erstellungsdatum in maschinenlesbarer Form zu drucken, möglicherweise mit, statwenn Sie dies nicht haben find -printf.
Tripleee
12

Das kannst du nicht. Der Schalter -c zeigt an, wann die Berechtigungen zuletzt geändert wurden, -a testet die letzte Zugriffszeit und -m testet die Änderungszeit. Das von den meisten Linux-Versionen (ext3) verwendete Dateisystem unterstützt keinen Datensatz "Erstellungszeit". Es tut uns leid!

Max Cantor
quelle
7
Tatsächlich ist es nicht nur der Dateisystemtyp - es gibt keine Systemschnittstelle zum Abrufen solcher Informationen, selbst wenn das Dateisystem sie enthält. Einer der Mängel von Unix reicht bis in die frühesten Tage zurück, weshalb Unix niemals abheben wird.
Chrisdowney
1
Unix wird nie abheben?
lucid_dreamer
8

@Max: stimmt mit der Erstellungszeit überein.

Wenn Sie jedoch die verstrichene Tage Argument für eine der berechnet werden soll -atime, -ctime, -mtimeParameter, können Sie den folgenden Ausdruck verwenden

ELAPSED_DAYS=$(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))

Ersetzen Sie "2008-09-24" durch ein beliebiges Datum und ELAPSED_DAYS wird auf die Anzahl der Tage zwischen damals und heute eingestellt. (Update: Subtrahieren Sie eins vom Ergebnis, um es an der Datumsrundung auszurichten find.)

Um eine am 24. September 2008 geänderte Datei zu finden, lautet der Befehl:

find . -type f -mtime $(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))

Dies funktioniert, wenn Ihre Version von finddie -newerXYin der Antwort von @Arve: genannten Prädikate nicht unterstützt .

Yukondude
quelle
2

Mit den Schaltern -atime, -ctime und -mtime können Sie sich dem nähern, was Sie erreichen möchten.

Ayaz
quelle
-3
cp `ls -ltr | grep 'Jun 14' | perl -wne 's/^.*\s+(\S+)$/$1/; print $1 . "\n";'` /some_destination_dir
Tim und Struppi
quelle
1
Warum kopieren Sie die Dateien? Neben dem Befehl in `ls ...`works wird das findTool nicht verwendet .
Yamaneko
-5

Ich habe dieses Skript in einem Skript gefunden, das alle Dateien löscht, die älter als 14 Tage sind:

CNT=0
for i in $(find -type f -ctime +14); do
  ((CNT = CNT + 1))
  echo -n "." >> $PROGRESS
  rm -f $i
done
echo deleted $CNT files, done at $(date "+%H:%M:%S") >> $LOG

Ich denke, ein wenig zusätzlicher "Mann finden" und das Suchen nach den Parametern -ctime / -atime usw. wird Ihnen hier helfen.

Georgi
quelle