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

Wie finde ich die älteste Datei in einem Verzeichnisbaum?

Das funktioniert (aktualisiert, um den Vorschlag von Daniel Andersson aufzunehmen):

find -type f -printf '%T+ %p\n' | sort | head -n 1

Dieses hier ist etwas portabler und weil es nicht auf GNU find angewiesen ist Erweiterung -printf , also funktioniert es auch unter BSD / OS X:

find . -type f -print0 | xargs -0 ls -ltr | head -n 1

Der einzige Nachteil hier ist, dass es etwas auf die Größe von ARG_MAX beschränkt ist (was sollte für die meisten neueren Kernel irrelevant sein). Also, wenn es mehr als getconf ARG_MAX sind Zeichen zurückgegeben (262.144 auf meinem System), gibt es Ihnen nicht das richtige Ergebnis. Es ist auch nicht POSIX-konform, weil -print0 und xargs -0 nicht.

Einige weitere Lösungen für dieses Problem werden hier skizziert:Wie finde ich die neueste (neueste, früheste, älteste) Datei in einem Verzeichnis? – Gregs Wiki


Die folgenden Befehle funktionieren garantiert mit allen seltsamen Dateinamen:

find -type f -printf "%T+ %p\0" | sort -z | grep -zom 1 ".*" | cat

find -type f -printf "%[email protected] %T+ %p\0" | \
    sort -nz | grep -zom 1 ".*" | sed 's/[^ ]* //'

stat -c "%y %n" "$(find -type f -printf "%[email protected] %p\0" | \
    sort -nz | grep -zom 1 ".*" | sed 's/[^ ]* //')"

Mit einem Null-Byte (\0 ) anstelle eines Zeilenvorschubzeichens (\n ) stellt sicher, dass die Ausgabe von find immer noch verständlich ist, falls einer der Dateinamen ein Zeilenvorschubzeichen enthält.

Die -z switch bewirkt, dass sowohl sort als auch grep nur Null-Bytes als Zeilenende-Zeichen interpretieren. Da es für Kopf keinen solchen Schalter gibt, verwenden wir grep -m 1 stattdessen (nur ein Vorkommen).

Die Befehle sind nach Ausführungszeit geordnet (gemessen auf meinem Rechner).

  • Der erste Befehl ist der langsamste, da er zuerst die mtime jeder Datei in ein für Menschen lesbares Format konvertieren und dann diese Zeichenfolgen sortieren muss. Piping to cat vermeidet das Einfärben der Ausgabe.

  • Der zweite Befehl ist etwas schneller. Während es noch die Datumskonvertierung durchführt, wird die numerische Sortierung (sort -n ) sind die seit der Unix-Epoche verstrichenen Sekunden etwas schneller. sed löscht die Sekunden seit der Unix-Epoche.

  • Der letzte Befehl führt überhaupt keine Konvertierung durch und sollte deutlich schneller sein als die ersten beiden. Der Find-Befehl selbst zeigt nicht die mtime der ältesten Datei an, also wird stat benötigt.

Zugehörige Manpages:find – grep – sed – sort – stat


Linux
  1. So finden Sie die älteste Datei in einem Verzeichnisbaum in Linux

  2. Wie kann ich alle Dateien bearbeiten, die von find in vi in ​​Linux zurückgegeben werden?

  3. Wie kann ich eine Datei oder ein Verzeichnis namens \ entfernen?

  4. Wie kopiere ich einen Verzeichnisbaum, aber nicht die Dateien in Linux?

  5. Kann .so nicht im selben Verzeichnis wie die ausführbare Datei finden?

So ermitteln Sie die Gesamtgröße eines Verzeichnisses in Linux

Wie finde ich den Typ einer Img-Datei und mounte sie?

Wie kann ich einen Verzeichnisbaum in C++/Linux erstellen?

Wie kann ich eine MD5-Prüfsumme eines Verzeichnisses berechnen?

Wie finde ich den my.cnf-Speicherort von MySQL?

Wie finde ich den Standard-Dateimanager?