Solución
Suministrando la opción -c
(o --total
) a du(1)
, puede indicarle que genere un total general. Si su implementación de du(1)
admite cualquiera de estas opciones, puede lograr el efecto deseado usando el siguiente comando:
$ find . -name 'flibble*' -ctime +90 -exec du -shc {} +
EDITAR: Tenga en cuenta que si la cantidad de archivos excede la cantidad máxima de parámetros permitidos por su sistema, find
aún puede ejecutar command
varias veces. Algunas implementaciones de du(1)
también admite la lectura de los nombres de archivo de un archivo, que no sufre de la limitación mencionada:
$ find -name 'flibble*' -ctime +90 -print0 > filenames
$ du -shc --files0-from=filenames
Explicación
La diferencia entre la semántica de -exec command {} \;
y -exec command {} +
es el siguiente:
-
command {} \;
ejecutacommand
una vez por cada resultado defind
. Se pasa la ruta del resultado en lugar de{}
.$ touch 1 2 3 $ find 1 2 3 -maxdepth 0 -exec echo {} \; 1 2 3
-
command {} +
ejecutacommand
, cuando se hayan recuperado todos los resultados. Los nombres de ruta de los resultados se pasan en lugar de{}
.$ touch 1 2 3 $ find 1 2 3 -maxdepth 0 -exec echo {} + 1 2 3
El -print0
opción provoca find(1)
para imprimir los nombres de archivo encontrados en la salida estándar separados por el carácter nulo y el --files0-from
opción causó du(1)
para leer los nombres de archivo separados por valores nulos. A diferencia del carácter de nueva línea, es posible que el carácter nulo no aparezca en un nombre de archivo, por lo que el resultado no es ambiguo.
Para obtener más información sobre las opciones de du(1)
y find(1)
, debe consultar las respectivas páginas de manual:
$ man du
$ man find
Prueba esto:
du -c `find . -name 'flibble*' -ctime +90` | tail -1
El comando original es dar du un argumento, luego ejecutarlo, hasta que pasa por todos los argumentos. De esta manera, simplemente le está dando todos los argumentos a la vez, luego corta los tamaños separados y deja solo el total. Si lo desea, puede quitar la tubería y la cola para mostrar el tamaño de cada archivo.
Puedes probar esto:
find . -name 'flibble*' -ctime +90 -exec du -ch {} + | grep total