
У меня есть файл со списком файлов и каталогов, содержащий подстановочный знак *
. Я пытаюсь вывести размер записей 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 не имеет соответствующих файлов.