¿Cómo ejecutar la utilidad xargs en todas las líneas de entrada expandidas?

¿Cómo ejecutar la utilidad xargs en todas las líneas de entrada expandidas?

Tengo un archivo con una lista de archivos y directorios que contiene el comodín *. Estoy intentando generar el tamaño de las entradas duy 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 dusolo 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 filetiene 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_SUBSTexpansión ( ${~...}) indica zshque 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_GLOBopción. Esa configuración será necesaria si alguno de los patrones globales no tiene archivos coincidentes.

información relacionada