2012-02-15 12 views
5

Próbuję użyć polecenia du dla każdego katalogu w bieżącym. Więc próbuję użyć kodu takiego:Dlaczego pipelowanie du lub echo nie działa?

ls | du -sb 

Ale nie działa zgodnie z oczekiwaniami. Wyprowadza tylko rozmiar bieżącego "." katalog i to wszystko. To samo dotyczy echa

ls | echo 

Powoduje wyprowadzenie pustej linii. Dlaczego to się dzieje?

Odpowiedz

11

za pomocą rury wysyła wyjście (standardowe wyjście) pierwszego polecenia do standardowego wejścia (wejście) sposobu dzieci (2 polecenia). Polecenia, o których wspomniałeś, nie pobierają żadnych danych wejściowych na temat stdin. To będzie działać, na przykład, z cat (i przez pracę, to znaczy pracować jak cat metę bez żadnych argumentów, a tylko przejść wzdłuż wejścia ją podać):

ls | cat 

dla aplikacji, to gdzie xargs wchodzi. Bierze sygnał wejściowy i podaje go jako argumenty dla określonego polecenia. Tak, można zrobić to praca jak:

ls | xargs du -sb 

Pamiętaj, że domyślnie xargs złamie swoje wejście na przestrzeni, więc jeśli nazwy plików zawierają spacje to nie będzie działać, jak chcesz. Tak więc, w tym konkretnym przypadku, to byłoby lepiej:

du -sb * 
+0

co to znaczy du -sb * ? – Romeno

+0

'*' jest globusem (lub symbolem wieloznacznym, jak być może znasz). Powłoka zastąpi go wszystkimi nazwami plików (lub katalogów itp.) W bieżącym katalogu, które pasują do niego. Y może również na przykład powiedzieć '* .jpg', aby dopasować dowolny plik kończący się na .jpg – FatalError

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

lub

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

podstawienie Użyj polecenia, na przykład:

du -sb $(ls -d */) 
Powiązane problemy