Metode terpendek saya menggunakan zsh:
print -rl -- **/*(.Om)
(tambahkan D
kualifikasi glob jika Anda juga ingin membuat daftar file tersembunyi atau file dalam direktori tersembunyi).
Jika Anda menemukan GNU, buatlah untuk mencetak waktu modifikasi file dan urutkan berdasarkan itu. Saya berasumsi tidak ada baris baru dalam nama file.
find . -type f -printf '%T@ %p\n' | sort -k 1 -n | sed 's/^[^ ]* //'
Jika Anda memiliki Perl (sekali lagi, dengan asumsi tidak ada baris baru dalam nama file):
find . -type f -print |
perl -l -ne '
$_{$_} = -M; # store file age (mtime - now)
END {
$,="\n";
print sort {$_{$b} <=> $_{$a}} keys %_; # print by decreasing age
}'
Jika Anda memiliki Python (sekali lagi, dengan asumsi tidak ada baris baru dalam nama file):
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'
Jika Anda memiliki akses SSH ke server itu, pasang direktori di atas sshfs pada mesin yang lebih baik:
mkdir mnt
sshfs server:/path/to/directory mnt
zsh -c 'cd mnt && print -rl **/*(.Om)'
fusermount -u mnt
Dengan hanya alat POSIX, ini jauh lebih rumit, karena tidak ada cara yang baik untuk menemukan waktu modifikasi file. Satu-satunya cara standar untuk mengambil waktu file adalah ls
, dan format output tergantung lokal dan sulit untuk diurai.
Jika Anda dapat menulis ke file, dan Anda hanya peduli pada file biasa, dan tidak ada baris baru dalam nama file, inilah kludge yang mengerikan: buat tautan keras ke semua file dalam satu direktori, dan urutkan berdasarkan waktu modifikasi.
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