Oracle Linux 6.7 -bash: /usr/bin/du: Lista de argumentos demasiado larga

Oracle Linux 6.7 -bash: /usr/bin/du: Lista de argumentos demasiado larga

Tengo una ruta de aproximadamente 1 millón de carpetas con un tamaño total de 300 GB. Cuando ejecuto el du -sh *comando, aparece el error que mencioné en el título. ¿Cómo puedo combinar el uso xargscon este comando o resolveré xargsmi problema? Sin embargo, todavía necesito un comando separado para buscar carpetas de más de 20 GB en la misma ruta. Necesita ayuda para utilizar estos dos comandos.

Ejemplo de ruta:/data/dataold/exports/

El resultado debería ser el siguiente (puede pensar en lo que he indicado a continuación como los nombres de archivos y carpetas en la ruta principal que he especificado en la línea anterior):

4.0K xyz.sh
12K asdasda.txt
10G QWERT
1G ASDFGH

Atentamente.

Respuesta1

Una opción es usar find, pero sugiero una de las otras soluciones que se muestran a continuación.

find /data/dataold/exports -mindepth 1 -maxdepth 1 -exec du -sh {} \;

Suponiendo que /data/dataold/exportscontiene los subdirectorios

foo
bar
baz

(y tal vez más), se ejecutará

du -sh /data/dataold/exports/foo
du -sh /data/dataold/exports/bar
du -sh /data/dataold/exports/baz

etc.

La opción -mindepthevita ejecutar el ducomando for /data/dataold/exportsy -maxdepthlo evita para subdirectorios de un subdirectorio, por ejemplo, for /data/dataold/exports/foo/something.

Como se sugiere encas' comentario, puedes usar

find /data/dataold/exports -mindepth 1 -maxdepth 1 -exec du -sh {} \+

en lugar de ... -exec du -sh {} \;, si su versión de findlo admite. Con +en lugar de ;, findse ejecutará duuna vez cada vez que se llene el búfer de argumentos de Linux (aproximadamente 2 MB) en lugar de ejecutarlo una vez por cada archivo/directorio. El primero esmuchomás rápido.

CitandoStéphane Chazelas' comentario: "Tenga en cuenta que llamar a varias invocaciones independientes de du(como con find -exec) puede dar números diferentes si hay enlaces físicos en esos directorios de nivel superior, ya que no se deduplicarán si los encuentran diferentes invocaciones de du. "


Con GNU dupuedes limitar la profundidad que se mostrará usando la opción -do --max-depth=N:

du -h -d 1 /data/dataold/exports

Esto hará el cálculo para todos los subdirectorios pero limitará la salida a una profundidad de 1 debajo del punto inicial, por lo que en el ejemplo que se muestra arriba debería imprimir el tamaño total de

/data/dataold/exports/foo
/data/dataold/exports/bar
/data/dataold/exports/baz

etc y para

/data/dataold/exports

Se debe preferir la segunda solución, si está disponible, porque no es necesario iniciar un nuevo duproceso para cada subdirectorio (en el caso de -exec ... \;) o para cada conjunto de subdirectorios que llenan el búfer de argumentos (en el caso de -exec ... \+).

Si su versión de duno admite la opción, -dpuede usar

du -h /data/dataold/exports

y filtre la salida para eliminar todo lo que esté debajo del primer nivel de subdirectorios.


Si desea filtrar la salida por comparación numérica, le sugiero omitir la opción -h. Para evitar esperar el acceso lento al sistema de archivos mientras se prueba el filtrado, sugiero redirigir la salida a un archivo, por ejemplo

du -d 1 /data/dataold/exports > outputfile

o

du -d 1 /data/dataold/exports 2>errors | tee outputfile

y procesar el contenido de outputfilemás tarde.

Ejemplo:

awk '$1 > 20e9` outputfile

Si su duopción no admite, -dpuede usar algo como

du /data/dataold/exports > outputfile
awk '$1 > 20e9 && $1 != /\/.*\/.*\/.*\/.*\/.*/` outputfile

Esto imprimirá todas las líneas que tengan un número mayor que 20 * 10^9 en el primer campo y un valor que no contenga 5 (o más) barras en el segundo campo. El número de barras en la segunda condición se adapta al directorio de inicio /data/dataold/exportsy se imprimirá, por ejemplo, /data/dataold/exports/foopero no por ejemplo /data/dataold/exports/foo/bar.

Respuesta2

Intenta no resumir y luego deja duhacer el trabajo. Aplicar sortcon -horden humana y luego limitar a un tamaño específico:

du -h /data/dataold/exports/ | sort -h

Úselo para enumerar en orden inverso, es decir, archivos grandes a pequeños -r.sort

Para seleccionar el tamaño, un simple truco awksería suficiente:

du -h /data/dataold/exports/ | awk -F'G' '$1~/^[0-9]+$/ && $1>=20' | sort -h 

Es decir: use G(de la salida de tamaño GB) como separador de campo, verifique si el campo es solo un número (para excluir coincidencias incorrectas con el separador G) y luego seleccione números mayores a 20 únicamente. La clasificación aquí es opcional.

información relacionada