Ordene los archivos en el directorio de forma recursiva en función de la última fecha de modificación

11

Ordene los archivos en el directorio de forma recursiva en función de la última fecha de modificación

He modificado muchos archivos en mi directorio, quiero saber cuáles son esos archivos ordenándolos por la fecha de la última modificación y en eso quiero que se excluyan algunas de las extensiones

en el directorio svn también tengo muchos archivos .svn que no quiero mostrar en el orden

Danny
fuente
Demuestro cómo excluir la extensión en mi respuesta.
mikeserv

Respuestas:

18
find -printf "%TY-%Tm-%Td %TT %p\n" | sort -n

te dará algo como

2014-03-31 04: 10: 54.8596422640 ./foo
2014-04-01 01: 02: 11.9635521720 ./bar

n.st
fuente
¿Puedo excluir una extensión de archivo de la carpeta ....
Danny
@Danny Sí, eso es fácil de encontrar: find -not -iname '*.ext'.
n.st
find -not -path " svn " -not -name "* svn" -printf "% TY-% Tm-% Td% TT% p \ n" | ordenar -n esto es exactamente lo que necesitaba muchas gracias @ n.st
Danny
5

Si desea aplanar la estructura del directorio (por lo tanto, ordenar por fecha sobre todos los archivos en todos los directorios, ignorando en qué directorio están los archivos), el findenfoque sugerido por @yeti es el camino a seguir. Si desea preservar la estructura del directorio, puede intentar

$ ls -ltR /path/to/directory

que ordena el directorio basado.

Andreas Wiese
fuente
1
esto me da una carpeta sabia, ya que lo que necesito es todo junto, ¿cuáles son los archivos recientemente modificados?
Danny
5

En bash, corre shopt -s globstarprimero. En ksh93, corre set -o globstarprimero. En zsh, ya estás listo.

ls -dltr **/*

Esto devolverá un error si tiene tantos archivos que se excede el límite de longitud de la línea de comandos en su sistema. En zsh, puede usar esto en su lugar:

print -rl -- **/*(Om)
Gilles 'SO- deja de ser malvado'
fuente
Esta es la única respuesta aquí que funciona para Solaris 10, ¡gracias! :)
laxxy
3

Asumiendo que estás usando GNU find, prueba:

find $SOMEPATH -exec stat -c '%Y %n' '{}' + | sort -n

fuente
1
Puede usar findla -printfopción para evitar invocar un proceso separado (o varios, dependiendo de la cantidad de archivos). Vea mi respuesta para un ejemplo.
n.st
1
Sabiendo que hay otras formas de hacerlo, quería dar statuna oportunidad y mostrar -exec ... +. ¡De Verdad! A veces pienso, statmerece más atención ... y nadie debería tener recetas de aquí sin leer acerca de los ingredientes y pensar en las consecuencias ...
Por cierto ... no todo hallazgo tiene -printf...
1
@yeti: si findno tiene -printf, puede usar -exec sh -c 'printf...'para obtener la misma funcionalidad. Eso incluiría el acceso a $(pwd)rutas totalmente calificadas también.
mikeserv
2
Conocí a muchos usuarios de Linux que nunca habían leído stat. Así que a veces solo quiero dirigir un poco la atención sobre stat... Creo que lo statmerece ...
2

Para enumerar de manera sólida los nombres de archivo solo con herramientas recientes de GNU:

find . -printf '%A@ %p\0' |
  sort -nz |
  sed -z 's/^[^ ]* //' |
  tr '\0' '\n'
Graeme
fuente
2
find $DIR -depth -maxdepth 3 \
    -type d -readable -printf \
    'printf "\\n%p\\n"
    ls -t --color=always "%p"\n' |\
    . /dev/stdin 2>&-

Esto evita cualquier problema en la lista de argumentos porque el único argumento lsque recibirá será el nombre del directorio que desea enumerar. Puedes hacer esto con lo que quieras.

La cáscara simplemente . sourcesel |pipecomo script de shell - es el mismo proceso y no tiene los problemas que puede encontrar cuando execvese llama.

En cualquier caso, lo anterior solo tiene tres profundidades, que se puede ajustar cambiando maxdepth. También es profundo primero, por lo que puede avanzar hacia su directorio actual desde depth.

Es posible que note que también obtiene $LSCOLORS: en mi máquina, también proporciona columnas bien impresas y todo lo que desea de ls, o, de hecho, cualquier cosa que pueda imaginar que querría hacer con. source.

NO SVN

De nuevo, esto hará todo lo que esperas ls. Entonces, ocultar .svnarchivos es tan simple como cambiar la lslínea a:

ls -t --color=always --hide="*svn" "%p"\n

O si desea ver svnextensiones en cada carpeta PERO ./svnpodría cambiarla para que todo el comando se vea así:

    find $DIR -depth -maxdepth 3 \
        -type d -readable -printf \
            'printf "\\n%p\\n" ; hide=
            [ "%p" = "./svn" ] && hide="*svn"
            ls -t --color=always --hide="$hide" "%p"\n' |\
    . /dev/stdin 2>&-

Personalmente, me gusta con ls -sy, si te importa, -ulo ordenaré por tiempo de acceso en lugar de tiempo de modificación.

mikeserv
fuente
1

Esto va a enumerar todos files en <dir>con el ser superior más antigua modificado

find <dir> -type f -print0 | xargs -0 ls -ltr

Y con esto, la última modificación es superior

find <dir> -type f -print0 | xargs -0 ls -lt

Tenga en cuenta que esto solo funciona si la lista de nombres de archivos no supera el límite de longitud total de la línea de comandos en su sistema.

UnX
fuente
Es cierto, me olvidé de eso
UnX
para referencia sobre el comando: lista de argumentos
UnX
@Gilles: Quieres decir xargs -0(en ambos casos).  xargs -print0es equivalente a xargs -p -r -i -n -t -0or xargs -inprt0or xargs -0ntrip, que probablemente no sea lo que querías decir.
Scott