Betriebssystem: Linux
Dateisystemtyp: ext3
Bevorzugte Lösung: Bash (Skript / Oneliner), Ruby, Python
Ich habe mehrere Verzeichnisse mit mehreren Unterverzeichnissen und Dateien darin. Ich muss eine Liste aller dieser Verzeichnisse erstellen, die so aufgebaut ist, dass jedes Verzeichnis der ersten Ebene neben dem Datum und der Uhrzeit der zuletzt erstellten / geänderten Datei darin aufgeführt ist.
Wenn ich eine Datei berühre oder ihren Inhalt einige Unterverzeichnisebenen später ändere, sollte dieser Zeitstempel neben dem Verzeichnisnamen der ersten Ebene angezeigt werden. Angenommen, ich habe ein Verzeichnis, das wie folgt aufgebaut ist:
./alfa/beta/gamma/example.txt
und ich ändere den Inhalt der Datei example.txt
, ich brauche diese Zeit neben dem Verzeichnis der ersten Ebene alfa
in lesbarer Form angezeigt , nicht Epoche. Ich habe einige Dinge mit find und ähnlichen Methoden ausprobiert xargs
, sort
aber ich kann das Problem nicht umgehen, dass sich der Zeitstempel des Dateisystems von 'alfa' nicht ändert, wenn ich Dateien ein paar Ebenen tiefer erstelle / ändere.
quelle
Antworten:
Probier diese:
Führen Sie es mit dem Pfad zu dem Verzeichnis aus, in dem das rekursive Scannen beginnen soll (es unterstützt Dateinamen mit Leerzeichen).
Wenn viele Dateien vorhanden sind, kann es eine Weile dauern, bis etwas zurückgegeben wird. Die Leistung kann verbessert werden, wenn wir
xargs
stattdessen Folgendes verwenden :das ist ein bisschen schneller.
quelle
find $1 -type f -print0 | xargs -0 stat --format '%Y :%y %n' | sort -nr | cut -d: -f2- | head
Das schafft es immer noch, schnell für mich zu sein.brew install coreutils
und verwendengstat
stattstat
stat
dafind PATH -type f -printf "%T@ %p\n"| sort -nr
der Job erledigt ist. Auf diese Weise geht es auch etwas schneller.find PATH -type f -exec stat -f "%m %N" "{}" \; | sort -nr | head
So finden Sie alle Dateien, deren Dateistatus zuletzt vor N Minuten geändert wurde:
find -cmin -N
zum Beispiel:
find -cmin -5
quelle
sudo find -cmin -1 2>&1 |grep -v /proc/
GNU Find (siehe
man find
) verfügt über einen-printf
Parameter zum Anzeigen der EPOC-Zeit und des relativen Pfadnamens.quelle
tail
, um zu verhindern, dass Tausende von Zeilen in der Ausgabe gedruckt werden.awk '{print $2}'
Teil scheint Probleme zu verursachen, wenn Dateinamen mit Leerzeichen vorhanden sind. Hier ist eine Lösung, diesed
stattdessen verwendet, und es druckt auch die Zeit zusätzlich zum Pfad:find . -type f -printf '%T@ %Tc %P\n' | sort -n | tail | sed -r 's/^.{22}//'
touch "lala<Enter>b"
diese Option , um eine solche Datei zu erstellen. Ich denke, Unix Utilities Design hat große Fehler in Bezug auf Dateinamen.Ich habe die großartige Antwort von Halo auf diesen Einzeiler verkürzt
Aktualisiert : Wenn die Dateinamen Leerzeichen enthalten, können Sie diese Änderung verwenden
quelle
IFS=$'\n'
ist auf keinen Fall sicher beim Umgang mit Dateinamen: Zeilenumbrüche sind gültige Zeichen in Dateinamen unter UNIX. Nur das NUL-Zeichen ist garantiert nicht in einem Pfad vorhanden.Versuche dies
Es wird verwendet
find
, um alle Dateien aus dem Verzeichnis zu sammeln,ls
sie nach Änderungsdatum sortierthead
aufzulisten, die erste Datei auszuwählen und schließlichstat
die Uhrzeit in einem schönen Format anzuzeigen.Derzeit ist es nicht sicher für Dateien mit Leerzeichen oder anderen Sonderzeichen im Namen. Schreiben Sie eine Empfehlung, wenn sie Ihren Anforderungen noch nicht entspricht.
quelle
Dieser Befehl funktioniert unter Mac OS X:
find "$1" -type f -print0 | xargs -0 stat --format '%Y :%y %n' | sort -nr | cut -d: -f2- | head
Verwenden Sie unter Linux, wie im Originalposter angegeben,
stat
anstelle vongstat
.Diese Antwort ist natürlich die herausragende Lösung von user37078 , die vom Kommentar zur vollständigen Antwort befördert wird. Ich habe CharlesBs Erkenntnisse für
gstat
Mac OS X eingemischt. Ich habe übrigens eher Coreutils von MacPorts als Homebrew erhalten .Und so habe ich das in einen einfachen Befehl
~/bin/ls-recent.sh
zur Wiederverwendung gepackt:quelle
~/bin/ls-recent.sh
, haben Sie das Skript sorgfältig auf Unterschiede überprüft?find . -exec stat -f '%m%t%Sm %N' {} + | sort -n | cut -f2-
Sowohl die Perl- als auch die Python-Lösung in diesem Beitrag haben mir geholfen, dieses Problem unter Mac OS X zu lösen: /unix/9247/how-to-list-files-sorted-by-modification-date-recursively -no-stat-befehlsverfügbar .
Zitat aus dem Beitrag:
Perl:
Python:
quelle
Versteckte Dateien ignorieren - mit schönem und schnellem Zeitstempel
Behandelt Leerzeichen in Dateinamen gut - nicht, dass Sie diese verwenden sollten!
Weitere
find
Informationen finden Sie unter dem Link.quelle
Ich zeige dies für die letzte Zugriffszeit. Sie können dies leicht ändern, um die neueste Mod-Zeit zu erhalten.
Es gibt zwei Möglichkeiten, dies zu tun:
1) Wenn Sie eine globale Sortierung vermeiden möchten, die bei mehreren zehn Millionen Dateien teuer sein kann, können Sie Folgendes tun: (Positionieren Sie sich im Stammverzeichnis des Verzeichnisses, in dem Ihre Suche beginnen soll.)
Die obige Methode druckt Dateinamen mit immer neuerer Zugriffszeit und die letzte Datei, die gedruckt wird, ist die Datei mit der neuesten Zugriffszeit. Sie können natürlich die neueste Zugriffszeit mit einem "Schwanz -1" erhalten.
2) Sie können den Namen und die Zugriffszeit aller Dateien in Ihrem Unterverzeichnis rekursiv drucken lassen und dann nach Zugriffszeit und dem Ende des größten Eintrags sortieren:
Und da hast du es ...
quelle
Ich habe diesen Alias in meinem .profile, den ich ziemlich oft benutze
Es macht also das, wonach Sie suchen (mit Ausnahme von Datums- und Uhrzeitänderungen auf mehreren Ebenen) - sucht nach den neuesten Dateien (in diesem Fall * .log- und * .trc-Dateien); Außerdem werden nur Dateien gefunden, die am letzten Tag geändert wurden. Anschließend werden sie nach Zeit sortiert und über weniger ausgegeben:
ps. Beachten Sie, dass ich auf einigen Servern kein Root-Verzeichnis habe, aber immer sudo, sodass Sie diesen Teil möglicherweise nicht benötigen.
quelle
Sie können den Befehl printf geben, um einen Versuch zu finden
quelle
Schnelle Bash-Funktion:
Suchen Sie die zuletzt geänderte Datei in einem Verzeichnis:
Sie können auch Ihr eigenes Datums- / Uhrzeitformat als drittes Argument angeben.
quelle
Im Folgenden erhalten Sie eine Zeichenfolge des Zeitstempels und den Namen der Datei mit dem neuesten Zeitstempel:
Ergebnis einer Ausgabe des Formulars:
<yy-mm-dd-hh-mm-ss.nanosec> <filename>
quelle
Hier ist eine Version, die mit Dateinamen arbeitet, die auch Leerzeichen, Zeilenumbrüche und Glob-Zeichen enthalten können:
find ... -printf
Druckt eine Dateimodifikation (EPOCH-Wert), gefolgt von einem Leerzeichen und\0
abgeschlossenen Dateinamen.sort -zk1nr
liest NUL-terminierte Daten und sortiert sie umgekehrt numerischDa die Frage mit Linux markiert ist, gehe ich davon aus, dass
gnu
Utils verfügbar sind.Sie können oben mit folgenden Pipe:
zum Drucken der Änderungszeit und der Dateinamen, sortiert nach der Änderungszeit (zuletzt zuerst), die durch Zeilenumbrüche beendet wird.
quelle
Folgendes verwende ich (sehr effizient):
PROS:
VERWENDUNGSZWECK:
wo:
dir
- ein zu durchsuchendes Verzeichnis [aktuelles Verzeichnis]number
- Anzahl der neuesten anzuzeigenden Dateien [10]Die Ausgabe für
find_last /etc 4
sieht folgendermaßen aus:quelle
ls
Verwenden Sie dies für eine einfache Ausgabe. Es gibt keine Argumentliste, daher kann es nicht zu lang werden:Und nur mit
cut
Datum, Uhrzeit und Namen versehen:BEARBEITEN : Ich habe gerade bemerkt, dass die aktuelle Top-Antwort nach Änderungsdatum sortiert ist. Das ist mit dem zweiten Beispiel hier genauso einfach, da das Änderungsdatum in jeder Zeile an erster Stelle steht - schlagen Sie eine Sortierung auf das Ende:
quelle
Dies könnte auch mit einer rekursiven Funktion in bash erfolgen
Sei F eine Funktion, die die Zeit der Datei anzeigt, die lexikographisch sortierbar sein muss JJJJ-MM-TT usw. (os-abhängig?)
R die rekursive Funktion, die Verzeichnisse durchläuft
Und schlussendlich
quelle