¿Cómo mostrar tamaños de archivo "legibles para humanos" en los resultados de búsqueda?

11

Estoy tratando de encontrar todos los archivos grandes en mi servidor Centos. Para hacer eso estoy usando:

find / -maxdepth 10 -size +100000 -ls

Intenté cambiar -lsa -lshpero no está permitido.

¿Cómo puedo mostrar estos resultados con tamaños legibles por humanos (usando los sufijos k, M, ...)?

blarg
fuente
¿Cuál es su definición de legible para humanos? Para mí eso es lo suficientemente legible para los humanos.
manatwork
Deberías probar la fileutilidad con find.
Ramesh
@manatwork kb, mb, gb
blarg

Respuestas:

10

findno tiene opciones sofisticadas como ls. Si quieres ls -h, necesitas llamar ls.

find / -maxdepth 10 -size +100000 -exec ls -lh {} +

Recomiendo la -xdevopción de evitar recurrir a otros sistemas de archivos, lo que sería inútil si le preocupa el espacio en disco.

find / -xdev -maxdepth 10 -size +100000 -exec ls -lh {} +

Si usa zsh como su shell, en lugar de usar find, puede usar calificadores glob. Limitar el tamaño del archivo es simple: Lseguido de un tamaño; El tamaño puede tener una unidad opcional antes del número. Si no le importa la profundidad máxima, puede usar **/para recurrir a subdirectorios. Si le importa la profundidad máxima, es más engorroso ya que los patrones de globo zsh carecen de una forma de expresar "a lo sumo n ocurrencias". Para evitar la recurrencia entre dispositivos, use el dcalificador global; necesita encontrar el número de dispositivo, que puede mostrar con el statcomando en Linux ( stat -c %d /para mostrar solo el número) o con el propio statincorporado de zsh (ejecutar zmodload zsh/statpara cargarlo).

ls -lh /**/*(L+M99d$(stat -c %d /))
Gilles 'SO- deja de ser malvado'
fuente
4

El comando que está intentando es legible para mí. Sin embargo, puede hacer uso de la utilidad de archivo con la búsqueda de la siguiente manera.

find / -maxdepth 10 -size +100000 -exec sh -c 'file -b {} | grep text &>/dev/null' \; -print

Otra forma de hacerlo es usando el siguiente comando.

du -BM / | sort -nr

El comando anterior le dará los archivos en el tamaño de archivo ordenado.

Si está utilizando coreutils> 7.5 , puede ejecutar el siguiente comando para enumerar los archivos por tamaños.

du -ah / | grep -v "/$" | sort -h

En mi máquina, no tenía la sort -hopción disponible.

Como mencionó en el comentario, su formato legible para humanos es que el archivo debe tener el tamaño en kb , mb o gb . Iría con el segundo comando que había publicado como respuesta. El resultado que obtuve cuando lo usé en mi sistema es,

du -BM /home/ramesh/chk1/ | sort -nr

50M     /home/ramesh/chk1/
21M     /home/ramesh/chk1/Hierarchical_Clustering_Working
3M      /home/ramesh/chk1/checking_files
1M      /home/ramesh/chk1/checking/checking2
1M      /home/ramesh/chk1/checking/checking1
1M      /home/ramesh/chk1/checking/asdf
1M      /home/ramesh/chk1/checking
Ramesh
fuente
¿Hay alguna manera de establecer un límite inferior en su segundo comando? Los archivos más grandes aparecen en la parte superior y desaparecen rápidamente de la parte superior del shell EDITAR. Veo que solo tiene que quitar el r
blarg el
Puede redirigir la salida a un archivo agregando > outputal comando. Luego, puede abrir el archivo y ver el resultado que desee :)
Ramesh
Veo que esto también muestra carpetas, mientras que solo busco archivos
blarg
du -a --max-depth=10 / | sort -rnes el cierre que se me ocurrió. Sin embargo, en este caso, no mostrará el tamaño en KB, MB o GB.
Ramesh
1

Creo que lo que buscas es más como lo siguiente.

find / -maxdepth 10 -size +100000 -exec ls -lah {} + 

El le -execpermite ejecutar un comando y el {}se sustituye con el resultado del hallazgo. Por último, +es decir que encontrar es el final del comando y es obligatorio.

Tim Hughes
fuente
2
De hecho, es completamente innecesario citar el {}aquí. Las comillas simples en el comando son para el shell, pero el shell nunca va a ver el ls -lah <args...>comando en absoluto, ve {}, lo que no necesita ser citado. Es lo findque ve ls -lah {}y es lo findque expande el {}, y como lo implica el nombre de la -execopción, findusa una exec*llamada al sistema en los argumentos directamente, por lo que no habrá problemas con los espacios porque findno va a dividir las palabras en sus nombres de archivo.
jw013
1
La -aopción lses innecesaria ya que se espera que los argumentos sean archivos y no directorios. GNU encuentra usos ls -dilspara la -lsopción, por lo que replicarlo más de cerca sería ls -dilsh.
jw013
man find ofrece lo siguiente para el primer ejemplo de uso de -exec : find . -type f -exec file '{}' \; ejecuta archivos en cada archivo dentro o debajo del directorio actual. Tenga en cuenta que los corchetes están encerrados entre comillas simples para protegerlos de la interpretación como puntuación de script de shell. El punto y coma está protegido de manera similar mediante el uso de una barra diagonal inversa, aunque las comillas simples también podrían haberse utilizado en ese caso.
Tim Hughes
1
La página del manual simplemente aboga por una precaución innecesaria. No dolerá, pero no conozco ningún shell que requiera {}ser citado.
jw013