Ma méthode la plus courte utilise zsh:
print -rl -- **/*(.Om)
(ajoutez les D
qualificatifs glob si vous souhaitez également lister les fichiers cachés ou les fichiers dans des répertoires cachés).
Si vous avez GNU find, faites-le imprimer les heures de modification du fichier et triez-les. Je suppose qu'il n'y a pas de nouvelle ligne dans les noms de fichiers.
find . -type f -printf '%T@ %p\n' | sort -k 1 -n | sed 's/^[^ ]* //'
Si vous avez Perl (encore une fois, en supposant qu'il n'y ait pas de nouvelle ligne dans les noms de fichiers):
find . -type f -print |
perl -l -ne '
$_{$_} = -M; # store file age (mtime - now)
END {
$,="\n";
print sort {$_{$b} <=> $_{$a}} keys %_; # print by decreasing age
}'
Si vous avez Python (encore une fois, en supposant qu'il n'y ait pas de nouvelle ligne dans les noms de fichiers):
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'
Si vous avez un accès SSH à ce serveur, montez le répertoire sur sshfs sur une machine mieux équipée:
mkdir mnt
sshfs server:/path/to/directory mnt
zsh -c 'cd mnt && print -rl **/*(.Om)'
fusermount -u mnt
Avec seulement les outils POSIX, c'est beaucoup plus compliqué, car il n'y a pas de bon moyen de trouver l'heure de modification d'un fichier. La seule façon standard de récupérer les heures d'un fichier estls
et le format de sortie dépend des paramètres régionaux et est difficile à analyser.
Si vous pouvez écrire dans les fichiers et que vous ne vous souciez que des fichiers normaux et qu'il n'y a pas de nouvelle ligne dans les noms de fichiers, voici un horrible problème: créez des liens durs vers tous les fichiers dans un seul répertoire et triez-les par heure de modification.
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