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 $idir
Teil 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 sed
sieht 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 \n
in ändern \0
und sort
mit der -z
Option aufrufen. Oh, und lassen Sie die umständlichen sed
Aufrufe weg. Beachten Sie, dass Ihr Skript nicht funktioniert, wenn es $idir
welche 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 om
sortiert Dateien nach zunehmendem Alter (verwenden Sie ihn, Om
um 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)