GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie sortiere ich die Ergebnisse von Find Statement nach Datum?

nur Dateinamen abrufen ... sortiert nach Änderungsdatum

find + sort + cut Ansatz:

find . -regex ".*/[0-9.]+" -printf "%[email protected] %f\n" | sort | cut -d' ' -f2
  • %[email protected] - Zeitpunkt der letzten Änderung der Datei, wobei @ ist Sekunden seit Jan. 1, 1970, 00:00 GMT, mit Bruchteil

  • %f - Dateiname ohne führende Verzeichnisse (nur das letzte Element)

So sortieren Sie in absteigender Reihenfolge:

find . -regex ".*/[0-9.]+" -printf "%[email protected] %f\n" | sort -k1,1r | cut -d' ' -f2

Ihre Methode kann angepasst werden, um in einfachen Fällen zu funktionieren. Das Hauptproblem, mit dem Sie konfrontiert sind, besteht darin, dass Sie Eingaben weitergeben bis ls , aber ls nimmt keine Eingaben entgegen. ls nimmt Kommandozeilenargumente. Sie müssen also die Ausgabe von find übergeben als Argumente bis ls , mit einer Befehlssubstitution. Falls ein Verzeichnis gefunden wird, übergeben Sie außerdem -d bis ls um das Verzeichnis selbst und nicht seinen Inhalt aufzulisten.

OLDDATA=$(ls -td $(find . -regex ".*/[0-9.]+"))

Nur in einfachen Fällen, da es zwei Einschränkungen gibt:

  1. Dies beruht auf einer Befehlsersetzung ohne Anführungszeichen (ebenso wie die Verwendung von $OLDDATA danach). Daher wird davon ausgegangen, dass die Dateinamen keine Sonderzeichen (Leerzeichen oder Platzhalterzeichen \[*? enthalten ).
  2. Einige Versionen von ls kann Zeichen entstellen, die im aktuellen Gebietsschema nicht druckbar sind.
  3. Wenn die Gesamtlänge der Dateinamen zu lang ist, erhalten Sie eine Fehlermeldung. (Beachten Sie, dass find … -exec und xargs kann hier nicht helfen, seit ls muss einmal ausgeführt werden, damit die Reihenfolge der Dateinamen richtig ist. Alles, was sie tun könnten, ist, Fehler zu verbergen und eine nicht korrekt sortierte Ausgabe zu erzeugen – und im Fall von xargs ein paar weitere Zeichen zu verstümmeln .)

Eine robuste, einfache Möglichkeit, dies zu tun, ist die Verwendung von zsh. Dank Glob-Qualifizierern kann es Wildcard-Übereinstimmungen sortieren.

setopt extended_glob
OLDDATA=(**/[0-9.]##(om))
  • Da dies kein anderes Programm aufruft, gibt es außer dem verfügbaren Speicher keine Längenbegrenzung und kein Risiko, dass Dateinamen an irgendeiner Stelle verstümmelt werden.
  • Das Ergebnis ist eine Liste von Strings (jeder String ist ein Dateiname), kein String, also geht es in eine Array-Variable.
  • **/ durchläuft Unterverzeichnisse rekursiv und vermeidet die Verwendung von find .
  • ## bedeutet „eines oder mehrere der vorhergehenden“ in der erweiterten zsh-Glob-Syntax, es ist analog zu + in (erweiterter) Regex-Syntax.
  • (om) ist ein Glob-Qualifizierer, um Dateien nach Änderungszeit zu sortieren, wie ls -t .

Es gibt bekanntermaßen keinen einfachen Weg, dies robust mit POSIX-Tools oder sogar mit GNU-Tools und ksh zu tun.


Linux
  1. So finden Sie große Dateien unter Linux mit den Befehlen find und du

  2. Wie mache ich A Ls und sortiere dann die Ergebnisse nach Erstellungsdatum?

  3. Linux – Wie finde ich das Erstellungsdatum der Datei?

  4. Wie bekomme ich nur Dateien, die nach einem Date mit Ls erstellt wurden?

  5. Wie schafft es Coreutils Datum, solche seltsamen Ergebnisse zu erzielen?

So finden und listen Sie die Dateien rekursiv nach Datum in Linux auf

So finden Sie die IP-Adresse unter Linux

So finden Sie den Hostnamen unter Linux

So finden Sie das genaue Installationsdatum und die Uhrzeit Ihres Linux-Betriebssystems

So finden Sie das Installationsdatum und die Uhrzeit des Linux-Betriebssystems

So finden Sie Dateien in Debian