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.

2voto

tomsv Punkte 7007

Dies sollte eigentlich das bewirken, was der OP angibt:

Einzeiler in Bash:

$ for first_level in `find . -maxdepth 1 -type d`; do find $first_level -printf "%TY-%Tm-%Td %TH:%TM:%TS $first_level\n" | sort -n | tail -n1 ; done

was eine Ausgabe wie die folgende ergibt:

2020-09-12 10:50:43.9881728000 .
2020-08-23 14:47:55.3828912000 ./.cache
2018-10-18 10:48:57.5483235000 ./.config
2019-09-20 16:46:38.0803415000 ./.emacs.d
2020-08-23 14:48:19.6171696000 ./.local
2020-08-23 14:24:17.9773605000 ./.nano

Dies listet jedes Verzeichnis der ersten Ebene mit dem von Menschen lesbaren Zeitstempel der letzten Datei in diesen Ordnern auf, auch wenn sie sich in einem Unterordner befindet, wie in

"Ich muss eine Liste all dieser Verzeichnisse erstellen, die so aufgebaut ist so aufgebaut ist, dass jedes Verzeichnis der ersten Ebene neben dem Datum und Uhrzeit der zuletzt erstellten/geänderten Datei aufgelistet ist.

1voto

mark_infinite Punkte 365

Im Folgenden erhalten Sie eine Zeichenkette mit dem Zeitstempel und dem Namen der Datei mit dem neuesten Zeitstempel:

find $Directory -type f -printf "%TY-%Tm-%Td-%TH-%TM-%TS %p\n" | sed -r 's/([[:digit:]]{2})\.([[:digit:]]{2,})/\1-\2/' |     sort --field-separator='-' -nrk1 -nrk2 -nrk3 -nrk4 -nrk5 -nrk6 -nrk7 | head -n 1

Das Ergebnis ist eine Ausgabe in der Form: <yy-mm-dd-hh-mm-ss.nanosec> <filename>

1voto

Jason Larke Punkte 4919

Quick-Bash-Funktion:

# findLatestModifiedFiles(directory, [max=10, [format="%Td %Tb %TY, %TT"]])
function findLatestModifiedFiles() {
    local d="${1:-.}"
    local m="${2:-10}"
    local f="${3:-%Td %Tb %TY, %TT}"

    find "$d" -type f -printf "%T@ :$f %p\n" | sort -nr | cut -d: -f2- | head -n"$m"
}

Suche nach der zuletzt geänderten Datei in einem Verzeichnis:

findLatestModifiedFiles "/home/jason/" 1

Sie können auch Ihr eigenes Datums-/Zeitformat als drittes Argument angeben.

0voto

Nahuel Fouilleul Punkte 17814

Dies könnte auch mit einer rekursiven Funktion in Bash geschehen.

F sei eine Funktion, die die Zeit der Datei anzeigt, die lexikographisch sortierbar sein muss (abhängig vom Betriebssystem).

F(){ stat --format %y "$1";}                # Linux
F(){ ls -E "$1"|awk '{print$6" "$7}';}      # SunOS: maybe this could be done easier

R, die rekursive Funktion, die Verzeichnisse durchläuft:

R(){ local f;for f in "$1"/*;do [ -d "$f" ]&&R $f||F "$f";done;}

Und schließlich

for f in *;do [ -d "$f" ]&&echo `R "$f"|sort|tail -1`" $f";done

0voto

Izkata Punkte 8632

Für einfache ls Ausgabe, verwenden Sie dies. Es gibt keine Argumentliste, so dass sie nicht zu lang werden kann:

find . | while read FILE;do ls -d -l "$FILE";done

Und verschönert mit cut nur für die Daten, Zeiten und den Namen:

find . | while read FILE;do ls -d -l "$FILE";done | cut --complement -d ' ' -f 1-5

EDIT : Mir ist gerade aufgefallen, dass die aktuelle Top-Antwort nach Änderungsdatum sortiert ist. Das ist genauso einfach mit dem zweiten Beispiel hier, da das Änderungsdatum in jeder Zeile an erster Stelle steht - klatschen Sie eine Sortierung an das Ende:

find . | while read FILE;do ls -d -l "$FILE";done | cut --complement -d ' ' -f 1-5 | sort

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