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 xargs
con este comando o resolveré xargs
mi 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/exports
contiene 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 -mindepth
evita ejecutar el du
comando for /data/dataold/exports
y -maxdepth
lo 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 find
lo admite. Con +
en lugar de ;
, find
se ejecutará du
una 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 du
puedes limitar la profundidad que se mostrará usando la opción -d
o --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 du
proceso 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 du
no admite la opción, -d
puede 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 outputfile
más tarde.
Ejemplo:
awk '$1 > 20e9` outputfile
Si su du
opción no admite, -d
puede 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/exports
y se imprimirá, por ejemplo, /data/dataold/exports/foo
pero no por ejemplo /data/dataold/exports/foo/bar
.
Respuesta2
Intenta no resumir y luego deja du
hacer el trabajo. Aplicar sort
con -h
orden 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 awk
serí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.