Как запустить утилиту xargs для всех расширенных строк ввода?

Как запустить утилиту xargs для всех расширенных строк ввода?

У меня есть файл со списком файлов и каталогов, содержащий подстановочный знак *. Я пытаюсь вывести размер записей duи хотел бы получить общую сумму.

Если я начну с:

cat file | xargs du -hs

подстановочный знак *не раскрывается. Чтобы сделать это, я делаю:

cat file | xargs -I@ sh -c 'du -hs @'

Но если я попробую:

cat file | xargs -I@ sh -c 'du -hsc @'

Я получаю в общей сложностикаждый(расширенная) запись файла. Если файл выглядит так:

foo*
bar*

Я получу:

1K foo1
1K foo2
2K total
1K bar1
1K bar2
2K total

Как получить общую сумму всех записей в файле? Как запустить duтолько один раз для всех строк? Спасибо

решение1

cat file | xargs -I@ sh -c 'echo @' | xargs du -hsc

решение2

Если xargs не требуется, это также даст общую сумму du:

du -hsc ${(f)~"$(<file)"}

Это предполагает, что fileесть один шаблон glob на строку, и использует (f)флаг расширения для разделения ввода на строки. Как шаблон, так и имена файлов могут содержать пробелы. Расширение GLOB_SUBST( ${~...}) сообщает zshоб обработке подстановочных знаков во вводе.

Если шаблоны разделены только пробелами, флаг (f)не нужен:

setopt nullglob
du -hsc ${~$(<file)}

Это устанавливает NULL_GLOBопцию. Эта настройка будет необходима, если какой-либо из шаблонов glob не имеет соответствующих файлов.

Связанный контент