Mi método más corto usa zsh:
print -rl -- **/*(.Om)
(agregue los D
calificadores glob si también desea enumerar los archivos ocultos o los archivos en directorios ocultos).
Si tiene GNU find, haga que imprima los tiempos de modificación del archivo y ordene por eso. Supongo que no hay nuevas líneas en los nombres de archivo.
find . -type f -printf '%T@ %p\n' | sort -k 1 -n | sed 's/^[^ ]* //'
Si tiene Perl (nuevamente, suponiendo que no haya nuevas líneas en los nombres de archivo):
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 tiene Python (nuevamente, suponiendo que no haya nuevas líneas en los nombres de archivo):
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 tiene acceso SSH a ese servidor, monte el directorio sobre sshfs en una máquina mejor equipada:
mkdir mnt
sshfs server:/path/to/directory mnt
zsh -c 'cd mnt && print -rl **/*(.Om)'
fusermount -u mnt
Con solo las herramientas POSIX, es mucho más complicado, porque no hay una buena manera de encontrar el tiempo de modificación de un archivo. La única forma estándar de recuperar los tiempos de un archivo es ls
, y el formato de salida depende del entorno local y es difícil de analizar.
Si puede escribir en los archivos, y solo le importan los archivos normales, y no hay nuevas líneas en los nombres de los archivos, aquí hay un error horrible: cree enlaces duros a todos los archivos en un solo directorio y ordénelos por hora de modificació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