Meine kürzeste Methode verwendet zsh:
print -rl -- **/*(.Om)
( D
Fügen Sie die Glob-Qualifizierer hinzu, wenn Sie auch die versteckten Dateien oder die Dateien in versteckten Verzeichnissen auflisten möchten).
Wenn Sie GNU find haben, lassen Sie es die Datei-Änderungszeiten drucken und danach sortieren. Ich gehe davon aus, dass die Dateinamen keine Zeilenumbrüche enthalten.
find . -type f -printf '%T@ %p\n' | sort -k 1 -n | sed 's/^[^ ]* //'
Wenn Sie Perl haben (auch hier unter der Annahme, dass die Dateinamen keine Zeilenumbrüche enthalten):
find . -type f -print |
perl -l -ne '
$_{$_} = -M; # store file age (mtime - now)
END {
$,="\n";
print sort {$_{$b} <=> $_{$a}} keys %_; # print by decreasing age
}'
Wenn Sie Python haben (auch hier unter der Annahme, dass die Dateinamen keine Zeilenumbrüche enthalten):
find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in sorted(times.iterkeys(), key=lambda f:times[f]): print f'
Wenn Sie über SSH-Zugriff auf diesen Server verfügen, hängen Sie das Verzeichnis über sshfs auf einem besser ausgestatteten Computer an:
mkdir mnt
sshfs server:/path/to/directory mnt
zsh -c 'cd mnt && print -rl **/*(.Om)'
fusermount -u mnt
Mit nur POSIX-Werkzeugen ist es viel komplizierter, da es keine gute Möglichkeit gibt, den Änderungszeitpunkt einer Datei zu ermitteln. Die einzige Standardmethode zum Abrufen der Zeiten einer Datei ist ls
, und das Ausgabeformat ist vom Gebietsschema abhängig und schwer zu analysieren.
Wenn Sie in die Dateien schreiben können und sich nur für reguläre Dateien interessieren und es keine neuen Zeilen in den Dateinamen gibt, ist dies ein schrecklicher Fehler: Erstellen Sie feste Links zu allen Dateien in einem einzigen Verzeichnis und sortieren Sie sie nach dem Änderungszeitpunkt.
set -ef # disable globbing
IFS='
' # split $(foo) only at newlines
set -- $(find . -type f) # set positional arguments to the file names
mkdir links.tmp
cd links.tmp
i=0 list=
for f; do # hard link the files to links.tmp/0, links.tmp/1, …
ln "../$f" $i
i=$(($i+1))
done
set +f
for f in $(ls -t [0-9]*); do # for each file, in reverse mtime order:
eval 'list="${'$i'} # prepend the file name to $list
$list"'
done
printf %s "$list" # print the output
rm -f [0-9]* # clean up
cd ..
rmdir links.tmp