Lista de argumentos demasiado larga cuando se usa du

Lista de argumentos demasiado larga cuando se usa du

Tengo un comando para buscar archivos grandes en una carpeta en particular, pero por alguna razón no funciona en ciertas situaciones y aparece el error "Lista de argumentos demasiado larga". ¿Cómo soluciono este comando para que funcione siempre?

jbsmith:/tmp$ sudo du -hsx * | sort -rh | head -10
-bash: /usr/bin/sudo: Argument list too long

Respuesta1

Podrías reemplazar ese comando con finden lugar de globbing y hacerlo

sudo find . -maxdepth 1 ! -name "." -exec du -hsx {} + | sort -rh | head -10

asumiendo que findapoya la +notación.

Esto encontrará todo lo que se encuentre en el directorio actual sin descender más e ignorará el "." (¡gracias por ese recordatorio @rudimeier!)

Esto incluirá todos los archivos en el directorio actual, como el globo que tenía originalmente. A diferencia de ese globo, esto también encontrará archivos que comiencen con .(a menos que ya esté jugando con las opciones de Shell para habilitarlas dotglob).

Respuesta2

Llegué a esta pregunta mientras buscaba una manera de manejar la "lista de argumentos demasiado larga" con du. En mi caso, no quería filtrar la salida, sino obtener un total de todos los archivos que coinciden con un patrón. Con los enfoques de otras preguntas no pude obtener un total general ya que terminan llamando duvarias veces con un subconjunto de argumentos.

La solución fue utilizar --files0-from=en lugar de pasar nombres de archivos como argumentos.

Al final esto funcionó para mí:

du -Lhsc --files0-from=<(find -L -maxdepth 2 \( -name "*.gz" -o -name "*.xz" \) -print0)
  • -LSiga los enlaces simbólicos tanto para encontrar como para calcular el tamaño.
  • -cobtener el total acumulado
  • <()Procesar la sustitución para crear un filesobre la marcha.
  • -print0para cumplir con dulas expectativas
  • \( \)para poder usar -ocon dos -nameargumentos

De la misma manera la respuesta a la pregunta anterior podría ser:

du -hsx --files0-from=<(find -maxdepth 1 ! -name "." -print0) | sort -rh | head -10

Respuesta3

Con versiones recientes de GNU coreutils, puede utilizar el--max-depthopciónen lugar de enumerar los archivos con *. De esta manera, no corre el riesgo de alcanzar el límite de longitud de la línea de comando si hay demasiados archivos. No hay --min-depth, por lo que el directorio de nivel superior aparecerá al final.

du -x -d 1 | head -n -1 | sort -r | head -n 10

Respuesta4

sudo ls | sudo parallel -j1 du -hsx | sort -rh | head -10

información relacionada