Wie verwende ich den UNIX-Befehl find
, um nach Dateien zu suchen, die an einem bestimmten Datum erstellt wurden?
Wie verwende ich den UNIX-Befehl find
, um nach Dateien zu suchen, die an einem bestimmten Datum erstellt wurden?
Antworten:
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 -newerXY
und ! -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.
-newerBt
stimmt die Geburtszeit (Erstellungszeit) der Datei überein .
-newerxt
auf 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).
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
ctime
hat nichts mit der Erstellungszeit zu tun , es ist die Inode-Änderungszeit.
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
find
dem es fehlt-newerXY
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
stat
wenn Sie dies nicht haben find -printf
.
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: stimmt mit der Erstellungszeit überein.
Wenn Sie jedoch die verstrichene Tage Argument für eine der berechnet werden soll -atime
, -ctime
, -mtime
Parameter, 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 find
die -newerXY
in der Antwort von @Arve: genannten Prädikate nicht unterstützt .
cp `ls -ltr | grep 'Jun 14' | perl -wne 's/^.*\s+(\S+)$/$1/; print $1 . "\n";'` /some_destination_dir
`ls ...`
works wird das find
Tool nicht verwendet .
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.