![Lista de argumentos demasiado larga cuando se usa du](https://rvso.com/image/97215/Lista%20de%20argumentos%20demasiado%20larga%20cuando%20se%20usa%20du.png)
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 find
en lugar de globbing y hacerlo
sudo find . -maxdepth 1 ! -name "." -exec du -hsx {} + | sort -rh | head -10
asumiendo que find
apoya 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 du
varias 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)
-L
Siga los enlaces simbólicos tanto para encontrar como para calcular el tamaño.-c
obtener el total acumulado<()
Procesar la sustitución para crear unfile
sobre la marcha.-print0
para cumplir condu
las expectativas\( \)
para poder usar-o
con dos-name
argumentos
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-depth
opció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