2012-02-15 6 views
5

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

ls | du -sb 

Но его работа не работает должным образом. Он выводит только размер текущего значения. каталог и все. То же самое с эхом

ls | echo 

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

ответ

11

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

ls | cat 

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

ls | xargs du -sb 

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

du -sb * 
+0

что делает дю -sb * означает, ? – Romeno

+0

'*' является glob (или подстановочный знак, как вы можете это знать). Оболочка заменит его всеми именами файлов (или каталогами и т. Д.) В текущем каталоге, который соответствует ему. Y также может, например, сказать '* .jpg', чтобы соответствовать любому файлу, заканчивающемуся .jpg – FatalError

2
$ find . -type d -maxdepth 1 -exec du -sb {} \; 

или

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

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

du -sb $(ls -d */)