Phương pháp ngắn nhất của tôi sử dụng zsh:
print -rl -- **/*(.Om)
(thêm D
vòng loại toàn cầu nếu bạn cũng muốn liệt kê các tệp bị ẩn hoặc các tệp trong các thư mục ẩn).
Nếu bạn có GNU find, hãy làm cho nó in thời gian sửa đổi tệp và sắp xếp theo đó. Tôi giả sử không có dòng mới trong tên tập tin.
find . -type f -printf '%T@ %p\n' | sort -k 1 -n | sed 's/^[^ ]* //'
Nếu bạn có Perl (một lần nữa, giả sử không có dòng mới nào trong tên tệp):
find . -type f -print |
perl -l -ne '
$_{$_} = -M; # store file age (mtime - now)
END {
$,="\n";
print sort {$_{$b} <=> $_{$a}} keys %_; # print by decreasing age
}'
Nếu bạn có Python (một lần nữa, giả sử không có dòng mới nào trong tên tệp):
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'
Nếu bạn có quyền truy cập SSH vào máy chủ đó, hãy gắn thư mục qua sshfs trên máy được trang bị tốt hơn:
mkdir mnt
sshfs server:/path/to/directory mnt
zsh -c 'cd mnt && print -rl **/*(.Om)'
fusermount -u mnt
Chỉ với các công cụ POSIX, nó phức tạp hơn nhiều, vì không có cách nào tốt để tìm thời gian sửa đổi của tệp. Cách tiêu chuẩn duy nhất để truy xuất thời gian của tệp là ls
và định dạng đầu ra phụ thuộc vào ngôn ngữ và khó phân tích.
Nếu bạn có thể ghi vào các tệp và bạn chỉ quan tâm đến các tệp thông thường và không có dòng mới nào trong tên tệp, thì đây là một loại bùn khủng khiếp: tạo liên kết cứng đến tất cả các tệp trong một thư mục và sắp xếp chúng theo thời gian sửa đổi.
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