En kısa yöntemim zsh kullanır:
print -rl -- **/*(.Om)
( D
gizli dosyaları veya gizli dizinlerdeki dosyaları da listelemek istiyorsanız glob niteleyicileri ekleyin ).
Eğer GNU bulursanız, dosya değiştirme zamanlarını yazdırmasını ve buna göre sıralamasını sağlayın. Dosya adlarında yeni satırlar olmadığını varsayıyorum.
find . -type f -printf '%T@ %p\n' | sort -k 1 -n | sed 's/^[^ ]* //'
Perl'niz varsa (yine, dosya adlarında yeni satırlar olmadığını varsayarak):
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'unuz varsa (yine, dosya adlarında yeni satırlar olmadığını varsayarak):
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'
Bu sunucuya SSH erişiminiz varsa, dizini daha iyi donanımlı bir makinede sshfs üzerine bağlayın:
mkdir mnt
sshfs server:/path/to/directory mnt
zsh -c 'cd mnt && print -rl **/*(.Om)'
fusermount -u mnt
Yalnızca POSIX araçlarıyla, çok daha karmaşık, çünkü bir dosyanın değiştirilme zamanını bulmanın iyi bir yolu yok. Bir dosyanın zamanlarını almanın tek standart yolu ls
ve çıktı formatı yerel ayarlara bağlıdır ve ayrıştırılması zordur.
Dosyalara yazabiliyorsanız ve yalnızca normal dosyaları önemsiyorsanız ve dosya adlarında yeni satırlar yoksa, işte korkunç bir kludge: tek bir dizindeki tüm dosyalara sert bağlantılar oluşturun ve bunları değişiklik zamanına göre sıralayın.
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