Wie mache ich ein einfaches find
Verfahren, bei dem die Ergebnisse nach den zuletzt geänderten geordnet werden?
Hier ist der Strom, den find
ich benutze (ich mache ein Shell-Escape in PHP, also ist das die Begründung für die Variablen):
find '$dir' -name '$str'\* -print | head -10
Wie kann ich diese Reihenfolge ändern lassen, indem ich die Suche zuletzt ändere? (Hinweis: Ich möchte nicht, dass nach der Suche sortiert wird, sondern dass die Ergebnisse auf der Grundlage der zuletzt vorgenommenen Änderungen gefunden werden.)
Antworten:
Benutze das:
printf
Argumente vonman find
:%Tk
: Letzte Änderungszeit der Datei in dem von angegebenen Formatk
.@
: Sekunden seit dem 1. Januar 1970, 00:00 GMT, mit Bruchteilen.c
Datum und Uhrzeit des Gebietsschemas (Sa., 04. November, 12.02.33 EST, 1989).%p
: Dateiname.quelle
~/.zshrc
:fr () { find ./ -iname "*"$@"*" -printf "%T@ %Td-%Tb-%TY %Tk:%TM %p\n" | sort -n | cut -d " " -f 2- | grep -i "$@" ; }
Es werden rekursiv alle Dateien gesucht, die das Muster des ersten an command (fr <pattern>
) übergebenen Arguments enthalten, und diese werden mit dem letzten sortiert.find -L ...
ssed
, um den Sekundenbruchteil loszuwerden und ISO8601 zu verwenden, wie @PeterMortensen zeigte:find . -type f -printf "%TY-%Tm-%TdT%TT %p\n" | sort -r | ssed -R 's/^([^.]+)\.\d+ (.*)$/\1 \2/'
Die einfachste Methode ist die Verwendung von zsh dank seiner Glob-Qualifier .
Wenn Sie GNU find haben, lassen Sie es die Datei-Änderungszeiten drucken und danach sortieren.
Wenn Sie GNU find, aber keine anderen GNU-Dienstprogramme haben, verwenden Sie Zeilenumbrüche als Trennzeichen anstelle von Nullen. Sie verlieren die Unterstützung für Dateinamen mit Zeilenumbrüchen.
Wenn Sie Perl haben (hier gehe ich davon aus, dass die Dateinamen keine Zeilenumbrüche enthalten):
Wenn Sie Python haben (auch wenn Sie keine Zeilenumbrüche in den Dateinamen voraussetzen):
Es gibt wahrscheinlich eine Möglichkeit, dasselbe in PHP zu tun, aber ich weiß es nicht.
Wenn Sie nur mit POSIX-Tools arbeiten möchten, ist dies etwas komplizierter. Siehe So listen Sie Dateien rekursiv nach Änderungsdatum sortiert auf (kein stat-Befehl verfügbar! ).
quelle
find
Version zeigt die ältesten Dateien, und Sie müssen die-r
Option hinzufügensort
.Sie brauchen kein PHP oder Python, nur ls :
Wenn der Befehl * mit einem Fehlerstatus (dh einer zu langen Argumentliste ) beendet wird, können Sie mit find iterieren. Umschrieben von: Die maximale Länge der Argumente für einen neuen Prozess
find . -print0|xargs -0 command
(optimiert die Geschwindigkeit, wenn find "-exec +" nicht implementiert, aber "-print0" kennt)find . -print|xargs command
(wenn die Argumente keine Leerzeichen enthalten)Wenn der größte Teil der Argumente aus langen, absoluten oder relativen Pfaden besteht, versuchen Sie, Ihre Aktionen in das Verzeichnis zu verschieben: Eine
cd /directory/with/long/path; command *
weitere schnelle Lösung könnte darin bestehen, weniger Argumente zuzuordnen:command [a-e]*; command [f-m]*; ...
quelle
Sie brauchen nur ls
Sie könnten
find /wherever/your/files/hide -type f -exec ls -1rt "{}" +;
wie oben angegeben tun ,oder
quelle
xargs
Anrufels
mehrmals, wird die Art gebrochen werden.+;
am Ende? Es scheint dasselbe Ergebnis zu geben, ohne das;
es jedoch nicht funktioniert, ohne das+
?Die Ausweitung user195696 Antwort :
Für jede Datei wird diese erste gibt den numerischen Zeitstempel (zum Sortieren von durch Tabellierung gefolgt
\t
), dann eine für Menschen lesbare Zeitstempel, dann wird der Dateigröße (leiderfind
‚s-printf
in mebibytes nicht tun, nur kibibytes), dann wird der Dateiname mit relativer Pfad.Dann
sort -n
sortiert sie nach dem ersten numerischen Feld.Dann
cut
wird das erste numerische Feld entfernt, das für den Benutzer nicht von Interesse ist. (Druckt das zweite Feld weiter.) Das Standardfeldtrennzeichen ist\t
oder tabellarisch.Ausgabebeispiel:
Ich habe das Feld mit der Dateigröße absichtlich auf 6 Zeichen erweitert, da bei einer längeren Länge die visuelle Unterscheidung der Dateigröße schwierig wird. Auf diese Weise ragen Dateien über 1e6 KiB heraus: 1 Zeichen bedeutet 1-9 GB, 2 Zeichen bedeuten 10-99 GB usw.
Edit: hier ist eine andere Version (seit
find . -printf "%Tc"
Abstürzen auf MinGW / MSYS):Ausgabe geben wie:
Wo:
-I{}
bewirkt, dass das Vorkommen von{}
durch ein Argument ersetzt wird, und Zeilenumbrüche sind jetzt die Argumenttrennzeichen (beachten Sie die Leerzeichen in den Dateinamen oben).ls -G
Unterdrückt das Drucken des Gruppennamens (Platzverschwendung).ls -h --si
Erzeugt lesbare Dateigrößen (korrekter mit--si
).ls -t
sortiert nach Zeit, was hier irrelevant ist, aber das ist es, was ich normalerweise benutze.quelle
T@
durchs
in einem der oben genannten Befehle.OS X-Variante der Antwort von @ user195696:
Mit Zeitstempel:
Ohne Zeitstempel:
quelle
Ich stellte fest, dass dies unter Mac OS X erledigt wird (und generisch genug, um auch unter anderen Unixen zu funktionieren):
quelle
Wenn Ihre
find
Auswahl sehr einfach ist, können Sie möglicherweise darauf verzichten und einfach Folgendes verwendenls
:quelle
Versuchen:
Es ist aber auch nützlich, Daten nach
-mmin
/-mtime
und zu filtern-type
.quelle
Verwenden:
Dieser Befehl sortiert Dateien nach Änderungsdatum.
Und wie folgt darstellen:
quelle
Ich habe eine einfache Lösung, die sowohl für FreeBSD (OS X) als auch für Linux funktioniert:
quelle
Ich glaube nicht, dass
find
es irgendwelche Optionen gibt, um die Ausgabereihenfolge zu ändern.-mtime
Mit und-mmin
können Sie die Ergebnisse auf Dateien beschränken, die innerhalb eines bestimmten Zeitfensters geändert wurden, aber die Ausgabe wird nicht sortiert - das müssen Sie selbst tun. GNUfind
hat eine-printf
Option, mit der Sie unter anderem die Änderungszeit jeder gefundenen Datei (Format Strings%t
oder%Tk
) ausdrucken können . Das kann Ihnen helfen, diefind
Ausgabe nach Ihren Wünschen zu sortieren .quelle
Ich habe Akashs Antwort verbessert, indem ich das Skript so eingestellt habe, dass es Whitespace in Dateinamen korrekt verarbeitet:
quelle
Wenn Sie alle PNG-Dateien nach Zeit in bestellen möchten
$PWD
:Dieser einfache Einzeiler gibt die Flexibilität von regexp auf
find
und aufls
.quelle
Sie können
stat
BSD und Linux (nicht POSIX) folgendermaßen verwenden:Wenn Sie die Anzahl begrenzen möchten:
quelle
Es gibt einen sauberen und robusten Weg,
sort | head
nach Datum zu suchen:Verwenden Sie
ls -l
für einen schönen DruckAls Bash- Funktion:
Dies könnte mit einem oder zwei Argumenten ausgeführt werden oder sogar ohne:
Stichprobe:
Listet alle Nicht-Verzeichnisse nach Datum sortiert auf. Kein:
Sogar auf großen Dateisystembaum, wie
xargs
bereits sortierte Liste erhalten, bleibt die Dateireihenfolge korrekt, auch wennls
muss oft ausgeführt werden.Listet 12 weitere Neuere auf, die keine Verzeichnisse sind, sortiert nach Datum, wobei die Größe in lesbarer Form gedruckt ist
Wird 42 weitere symlinks auflisten
Listet alle Symlinks, Blockgeräte, Sockets und Zeichengeräte nach Datum sortiert auf.
Reihenfolge umkehren
Ersetzen
head
durchtail
und wechseln vonsort
undls
:Gleiche Funktion, gleiche Nutzung:
quelle
Wenn Sie nur einen vollständigen Pfad zu jedem Element erhalten möchten, können Sie dies wie folgt aufschreiben.
Wobei
-printf "% T @% p \ n" für die Angabe der Sortierkriterien (Datum),
'sort -nr' für die Sortierung nach Datum,
head -10 für die Auflistung der Top-10-Ergebnisse,
cut -d '' -f 2 zum Ausschneiden des führender Zeitstempel in jeder Zeile.
quelle
cut -d ' ' -f 2
wird unterbrochen, wenn Dateinamen Leerzeichen enthalten.Ich habe eine einfache Lösung.
Nach
cd
einem Verzeichnis verwendenfind . -iname "*" -ls
quelle