
Tengo un archivo con una lista de archivos y directorios que contiene el comodín *
. Estoy intentando generar el tamaño de las entradas du
y me gustaría obtener un total general.
Si empiezo con:
cat file | xargs du -hs
el comodín *
no se expande. Para ello hago:
cat file | xargs -I@ sh -c 'du -hs @'
Pero si lo intento:
cat file | xargs -I@ sh -c 'du -hsc @'
obtengo un total decadaentrada (ampliada) del archivo. Si el archivo se parece a:
foo*
bar*
obtendré:
1K foo1
1K foo2
2K total
1K bar1
1K bar2
2K total
¿Cómo obtengo el total general de todas las entradas del archivo? ¿Cómo ejecuto du
solo una vez para todas las líneas? Gracias
Respuesta1
cat file | xargs -I@ sh -c 'echo @' | xargs du -hsc
Respuesta2
Si no se requiere xargs, esto también producirá un total general con du
:
du -hsc ${(f)~"$(<file)"}
Esto supone que file
tiene un patrón global por línea y usa el (f)
indicador de expansión para dividir la entrada en líneas. Tanto el patrón como los nombres de archivo pueden contener espacios. La GLOB_SUBST
expansión ( ${~...}
) indica zsh
que se procesen los comodines en la entrada.
Si los patrones solo están separados por espacios en blanco, la (f)
bandera no es necesaria:
setopt nullglob
du -hsc ${~$(<file)}
Esto establece la NULL_GLOB
opción. Esa configuración será necesaria si alguno de los patrones globales no tiene archivos coincidentes.