Gibt es eine bessere Methode zum Sortieren von Dateien nach Erstellungsdatum?

Gibt es eine bessere Methode zum Sortieren von Dateien nach Erstellungsdatum?

Ich musste eine Liste von Verzeichnissen anzeigen, sortiert nach ihrem Erstellungsdatum, und habe mir diesen Codeausschnitt ausgedacht, den ich ziemlich clever fand. Gibt es eine offensichtlichere Möglichkeit, dies zu tun, die ich übersehen habe?

printf "%-20s\t\t\t%-s\n" "DATE" "CASE"
printf "%-20s\t\t\t%-s\n" "----" "----"

find $idir -mindepth 3 -maxdepth 3 -type d -printf "%T@ %Tc\t\t%p\n" \
     | sed "s#${idir}/##" \
     | sort -h \
     | sed "s#^[^ ]* ##"

Beispielausgabe

DATE                                    CASE
----                                    ----
Fri 06 Sep 2013 11:17:41 AM EDT         dir1/Baseline/2013_09_06_11_16_10
Fri 06 Sep 2013 01:44:38 PM EDT         dir2/Baseline/2013_09_06_13_42_48
Sun 08 Sep 2013 05:02:46 PM EDT         dir3/6 Month/2013_09_08_17_02_05
Fri 13 Sep 2013 02:28:30 PM EDT         dir4/Baseline/2013_09_13_14_25_09

Einzelheiten

Das Obige sucht genau 3 Verzeichnisse tief vom Verzeichnis $idir. Es druckt dann die Erstellungszeit aller Verzeichnisse aus, die in dieser Tiefe gefunden werden. Ich entferne dann den $idirTeil des Pfads aus der Ausgabe (brauche ihn nicht), sortiere ihn und schneide dann den %T@Teil der Ausgabe ab. Dies war nur so, dass ich die Ausgabe einfacher sortieren konnte.

Ohne den nachgestellten Wert sedsieht die Ausgabe folgendermaßen aus:

DATE                                    CASE
----                                    ----
1378480661.2612650000 Fri 06 Sep 2013 11:17:41 AM EDT           dir1/Baseline/2013_09_06_11_16_10
1378489478.3223970000 Fri 06 Sep 2013 01:44:38 PM EDT           dir2/Baseline/2013_09_06_13_42_48
1378674166.7427782000 Sun 08 Sep 2013 05:02:46 PM EDT           dir3/6 Month/2013_09_08_17_02_05
1379096910.4431689000 Fri 13 Sep 2013 02:28:30 PM EDT           dir4/Baseline/2013_09_13_14_25_09

Zeigen Sie mir eine sauberere Methode!

Antwort1

Es gibt keine gute, portable Methode, um Dateien nach ihrer Zeit zu sortieren. Die portabelsten Methoden sind:

  • Wenn Sie davon ausgehen können, dass Dateinamen nur druckbare Zeichen enthalten, rufen Sie auf ls -ltd.
  • Andernfalls verwenden Sie Perl.

Dies ist die klassische Methode, um Dateien mit GNU-Tools nach Datum zu sortieren. Sie gehen davon aus, dass die Dateinamen keine Zeilenumbrüche enthalten. Dies lässt sich leicht beheben, indem Sie \nin ändern \0und sortmit der -zOption aufrufen. Oh, und lassen Sie die umständlichen sedAufrufe weg. Beachten Sie, dass Ihr Skript nicht funktioniert, wenn es $idirwelche enthält, #*^$\[da sed sie als Sonderzeichen interpretiert.

cd "$idir" &&
find -mindepth 3 -maxdepth 3 -type d -printf '%T@ %Tc\t\t%p\0' |
sort -hz |
tr '\0\n' '\n\0' |
sed 's/^[^ ]* //'

Übrigens sortieren Sie Dateien nach ihrer Änderungszeit, nicht nach ihrer Erstellungszeit. Die meisten Unix-Varianten außer OSX unterstützen nicht durchgehend Erstellungszeiten (vom Dateisystem über den Kernel bis hin zu Userland-Tools).

Die einfache und saubere Möglichkeit, Dateien nach ihrem Änderungszeitpunkt zu sortieren, ist die Verwendung von zsh. Der Glob-Qualifizierer omsortiert Dateien nach zunehmendem Alter (verwenden Sie ihn, Omum zuerst die älteste Datei zu erhalten).

files=(*(om))
echo "The oldest file is $files[-1]"

Um eine Ausgabe wie die hier gezeigte zu erhalten, können Sie verwendenzstat.

zmodload zsh/stat
describe () {
  typeset -A st
  zstat -s -H st "$REPLY"
  echo "$st[mtime] $REPLY"
}
: */*/*(/+describe)

verwandte Informationen