วิธีที่สั้นที่สุดของฉันใช้ zsh:
print -rl -- **/*(.Om)
(เพิ่มตัวระบุD
วงกลมหากคุณต้องการแสดงรายการไฟล์ที่ซ่อนอยู่หรือไฟล์ในไดเรกทอรีที่ซ่อนอยู่)
หากคุณมี GNU ค้นหาให้พิมพ์เวลาแก้ไขไฟล์และเรียงลำดับตามนั้น ฉันถือว่าไม่มีบรรทัดใหม่ในชื่อไฟล์
find . -type f -printf '%T@ %p\n' | sort -k 1 -n | sed 's/^[^ ]* //'
หากคุณมี Perl (อีกครั้งสมมติว่าไม่มีบรรทัดใหม่ในชื่อไฟล์):
find . -type f -print |
perl -l -ne '
$_{$_} = -M; # store file age (mtime - now)
END {
$,="\n";
print sort {$_{$b} <=> $_{$a}} keys %_; # print by decreasing age
}'
หากคุณมี Python (สมมติว่าไม่มีบรรทัดใหม่ในชื่อไฟล์):
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'
หากคุณมีการเข้าถึง SSH ไปยังเซิร์ฟเวอร์นั้นให้ติดตั้งไดเรกทอรีผ่านsshfsบนเครื่องที่ดีกว่า:
mkdir mnt
sshfs server:/path/to/directory mnt
zsh -c 'cd mnt && print -rl **/*(.Om)'
fusermount -u mnt
ด้วยเครื่องมือ POSIX เพียงอย่างเดียวมันมีความซับซ้อนมากขึ้นเนื่องจากไม่มีวิธีที่ดีในการค้นหาเวลาแก้ไขของไฟล์ วิธีมาตรฐานเพียงอย่างเดียวในการเรียกคืนเวลาของไฟล์คือls
และรูปแบบเอาต์พุตขึ้นอยู่กับโลแคลและยากต่อการแยกวิเคราะห์
หากคุณสามารถเขียนไฟล์และคุณสนใจเฉพาะไฟล์ปกติและไม่มีบรรทัดใหม่ในชื่อไฟล์นี่คือ kludge ที่น่ากลัว: สร้างลิงก์ที่ยากไปยังไฟล์ทั้งหมดในไดเรกทอรีเดียวและจัดเรียงตามเวลาการแก้ไข
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