573 Stimmen

Rekursives Auffinden und Auflisten der zuletzt geänderten Dateien in einem Verzeichnis mit Unterverzeichnissen und Zeiten

  • Das Betriebssystem: Linux

  • Dateisystem-Typ: ext3

  • Bevorzugte Lösung: Bash (Skript/Einzeiler), Ruby oder Python

Ich habe mehrere Verzeichnisse mit mehreren Unterverzeichnissen und Dateien darin. Ich muss eine Liste all 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.

Zur Verdeutlichung: Wenn ich eine Datei berühre oder ihren Inhalt ein paar Unterverzeichnisebenen tiefer ändere, sollte dieser Zeitstempel neben dem Namen des Verzeichnisses der ersten Ebene angezeigt werden. Angenommen, ich habe ein Verzeichnis, das wie folgt strukturiert 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 angezeigt alfa in menschenlesbarer Form, nicht Epoche. Ich habe einige Dinge mit find ausprobiert, xargs , sort und dergleichen, aber ich komme nicht um das Problem herum, dass sich der Dateisystem-Zeitstempel von "alfa" nicht ändert, wenn ich Dateien ein paar Ebenen tiefer anlege/verändere.

638voto

Heppo Punkte 5937

Versuchen Sie dies:

#!/bin/bash
find $1 -type f -exec stat --format '%Y :%y %n' "{}" \; | sort -nr | cut -d: -f2- | head

Führen Sie es mit dem Pfad zu dem Verzeichnis aus, in dem es mit der rekursiven Suche beginnen soll (es unterstützt Dateinamen mit Leerzeichen).

Wenn viele Dateien vorhanden sind, kann es eine Weile dauern, bis das Ergebnis vorliegt. Die Leistung kann verbessert werden, wenn wir xargs stattdessen:

#!/bin/bash
find $1 -type f -print0 | xargs -0 stat --format '%Y :%y %n' | sort -nr | cut -d: -f2- | head

was ein wenig schneller ist.

290voto

iman Punkte 19326

So finden Sie alle Dateien, deren Dateistatus zuletzt geändert wurde N Minuten zuvor:

find -cmin -N

Zum Beispiel:

find -cmin -5

Utilice -ctime anstelle von -cmin seit Tagen:

find -ctime -3

Unter FreeBSD und MacOS : Sie können auch verwenden -ctime n[smhdw] für Sekunden, Minuten, Stunden, Tage und Wochen. Tage ist die Standardeinstellung, wenn keine Einheit angegeben wird.

Beispiele:

# FreeBSD and MacOS only:
find . -ctime -30s
find . -ctime -15
find . -ctime -52w

60voto

user2570243 Punkte 521

GNU find (siehe man find ) hat eine -printf zur Anzeige der Dateien in Epoch mtime und relativem Pfadnamen.

redhat> find . -type f -printf '%T@ %P\n' | sort -n | awk '{print $2}'

40voto

slashdottir Punkte 7139

Ich habe gekürzt Daniel Böhmers großartige Antwort zu diesem Einzeiler:

stat --printf="%y %n\n" $(ls -tr $(find * -type f))

Wenn die Dateinamen Leerzeichen enthalten, können Sie diese Änderung verwenden:

OFS="$IFS";IFS=$'\n';stat --printf="%y %n\n" $(ls -tr $(find . -type f));IFS="$OFS";

19voto

Daniel Böhmer Punkte 13473

Versuchen Sie dies:

#!/bin/bash
stat --format %y $(ls -t $(find alfa/ -type f) | head -n 1)

Sie verwendet find um alle Dateien aus dem Verzeichnis zu sammeln, ls um sie nach Änderungsdatum sortiert aufzulisten, head zur Auswahl der ersten Datei und schließlich stat um die Uhrzeit in einem schönen Format anzuzeigen.

Zur Zeit ist es nicht sicher für Dateien mit Leerzeichen oder anderen Sonderzeichen in ihren Namen. Schreiben Sie eine Empfehlung, wenn es Ihre Anforderungen noch nicht erfüllt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X