Почему du или echo pipelining не работает? - PullRequest
6 голосов
/ 15 февраля 2012

Я пытаюсь использовать команду du для каждого каталога в текущем.Поэтому я пытаюсь использовать такой код:

ls | du -sb

Но он работает не так, как ожидалось.Выводит только размер текущего '.'каталог и все.То же самое с echo

ls | echo

Выводит пустую строку.Почему это происходит?

Ответы [ 3 ]

14 голосов
/ 15 февраля 2012

Использование канала отправляет вывод ( stdout ) первой команды на stdin (вход) дочернего процесса (2-я команда).Упомянутые вами команды не принимают никакого ввода на stdin.Это будет работать, например, с cat (и под работой я имею в виду работу, подобную cat, запускается без аргументов и просто передается по вводимому вами вводу):

ls | cat

Для вашегоприложения, это то, где xargs входит. Он принимает конвейерный ввод и передает его в качестве аргументов указанной команде.Таким образом, вы можете заставить его работать следующим образом:

ls | xargs du -sb

Остерегайтесь того, что по умолчанию xargs будет разбивать ввод по пробелам, поэтому, если ваши имена файлов содержат пробелы, это не будет работать так, как вы хотите.Итак, в данном конкретном случае это будет лучше:

du -sb *
3 голосов
/ 15 февраля 2012

Используйте подстановку команд, например:

du -sb $(ls -d */)
2 голосов
/ 15 февраля 2012
$ find . -type d -maxdepth 1 -exec du -sb {} \;

или

$ ls -d */ | xargs du -sb
...