Busque archivos de más de X días y envíelos por su tamaño

8

Estoy tratando de obtener los archivos anteriores a varios días y enumerarlos en orden descendente en función de su tamaño con toda su información (tamaño, ruta completa, etc., algo similar proporcionado por ls).

Si bien puedo localizar archivos antiguos con:

find . -mtime +10

No puedo enumerar la información deseada.

usuario148335
fuente
por favor agregue su información de distribución y shell
lese
@lese: AIX 6.1; while echo $ SHELL -> / usr / bin / ksh
user148335
Esto suena como un XYProblem ... ¿realmente, como usted pregunta, necesita TODOS los archivos por orden de tamaño? ¿o está (más probablemente) buscando archivos "viejos" (> 10 días) lo suficientemente grandes y solo necesita, por ejemplo, los 200 más grandes para decidir cuál de ellos puede eliminar para ahorrar espacio? En el último caso, y dado que está en AIX tal vez sin herramientas gnu, una combinación de find (generar todos los archivos> 10 días) y awk (mantener los 200 archivos más grandes en una matriz y luego generarlos en orden) será su mejor apuesta
Olivier Dulac

Respuestas:

8

Siempre que sus rutas de archivo no contengan caracteres de nueva línea:

find . -mtime +10 -printf "%s %n %m %u %g %t %p" \( \
  -type l -printf ' -> %l\n' -o -printf '\n' \) | sort -k1,1 -n

Ver findmanual , sección Actions.

  • %s Tamaño del archivo en bytes.
  • %n Número de enlaces duros al archivo.
  • %m Bits de permiso de archivo (en octal ).
  • %u Nombre de usuario del archivo o ID de usuario numérico si el usuario no tiene nombre.
  • %g Nombre del grupo de archivos o ID numérico del grupo si el grupo no tiene nombre.
  • %t Hora de última modificación del archivo en el formato devuelto por la ctimefunción C.
  • %p Nombre del archivo
  • %l Objeto del enlace simbólico (cadena vacía si el archivo no es un enlace simbólico).

Por cierto: tenga en cuenta que el manual POSIX find no especifica la mayoría de las acciones anteriores.

patryk.beza
fuente
1
Dice: find: 0652-017 -printf no es una opción válida.
user148335
para mí esto funciona y parece una solución bastante limpia +1
lese
@ user148335, no mencionaste qué distribución de Linux estás ejecutando. Parece que está limitado a la especificación de búsqueda POSIX , que es bastante limitada.
patryk.beza
1
@ patryk.beza supongo que estaba hablando con user148335
lesa
AIX 6.1; while echo $ SHELL -> / usr / bin / ksh
user148335
4

Este comando usa solo las características POSIX de findy de ls:

find . -type f -mtime +10 -exec ls -lS {} +

Sin embargo, puede llamar lsmás de una vez, si hay una gran cantidad de archivos en el directorio actual (o subdirectorios recursivamente) que coinciden con el -mtime +10primario.

Si llama lsmás de una vez, por supuesto, la clasificación solo se realizará dentro de cada lsejecución, no a través de múltiples ejecuciones.

Aún así, para un número razonable de archivos, esta es probablemente su mejor opción.

Miguel G
fuente
La versión actualizada no rompe con espacios en el nombre
Miguel G
1
Si lsse pasa solo un argumento, hay poca clasificación que pueda hacer en él. Con en +lugar de ;, eso sería mejor, pero lsaún podría terminar siendo llamado varias veces si hay muchos archivos.
Stéphane Chazelas
2
Este es el comando exacto que habría dado, así que agregué el texto explicativo que habría dado para acompañarlo.
Comodín el
3

Con zsh:

ls -ldrS -- **/*(m+10)

O para evitar la doble clasificación (por nombre por zsh y por tamaño por ls):

ls -ldrS -- **/*(m+10oN) # disable zsh sorting

o (si su lssoporte -Upara sin clasificar):

ls -ldU -- **/*(m+10oL) # disable ls sorting and have zsh sort by size

Agregue el Dcalificador global si desea ver también los archivos ocultos.

Stéphane Chazelas
fuente
¿Funciona esto cuando los nombres de usuarios y grupos contienen espacios?
roaima
@roaima, sí. ¿Por qué no lo haría? Puede romperse para E2BIG, que puede solucionar utilizando zargs.
Stéphane Chazelas
Desde que lo proporcionó, sospeché que estaría bien, pero necesitaba preguntar :-)
roaima
1

Creo que podrías hacer algo similar a:

find . -type f -mtime +10 -print0 | sort -n -r -k1 | while IFS= read -r -d $'\0' line; do
    #echo "$line"
    ls -lS "$line"    
done

observe el -Sparámetro de lscomando:

-S ordenar por tamaño de archivo

lese
fuente
Después de soltar -d $ '\ 0' debido al mensaje: $ \ 0: Este no es un identificador que logré obtener, pero los archivos no se escriben descendiendo en función de su tamaño
user148335
Se romperá cuando encuentre un directorio debajo /home/phphil. Pruebals -ld ...
roaima
@Roaima, ¿qué pasa con el uso en su find . -type flugar?
lese
@lese He cambiado el código, pero el comando parece arrojar dos veces cada archivo de cada subcarpeta. Ex.
user148335
find ... -type ffuncionaría, al igual que agregar la -dbandera als
roaima
1

prueba esto:

find ./ -type f -mtime +10 -exec ls -ln {} \; | sort -r -k 5 -g
dervishe
fuente
Con la opción -n, que no es un problema porque ls no una lista de nombre de usuario y nombre de grupo, pero UID y GID lugar
dervishe
0

Para una línea más sencilla, puede usar la findopción -ls. Parece que, en la mayoría de los casos, el tamaño del archivo está en la séptima columna de la información enumerada (por lo tanto, cambie 7al final del comando según corresponda si no es así):

find . -type f -mtime +10 -ls | sort -n -r -k7
Dios de madera
fuente
0

Otra variación sería usar:

  • buscar (para encontrar los archivos coincidentes)
  • du (para mostrar el tamaño del archivo en KB)
  • sort -n -r (a corto en orden descendente)

Aquí está el comando:

find . -type f -mtime +10 -exec du -k {} \; | sort -n -r
Stephen Quan
fuente