2012-02-15 8 views
5

나는 현재 디렉토리의 모든 디렉토리에 대해 du 명령을 사용하려고합니다. 그래서 다음과 같은 코드를 사용하려고합니다 :du 또는 echo 파이프 라이닝이 작동하지 않는 이유는 무엇입니까?

ls | du -sb 

예상대로 작동하지 않습니다. 현재 ''의 크기 만 출력합니다. 디렉토리와 그게 다야. 동일한 것은 반향입니다.

ls | echo 

빈 줄을 출력합니다. 왜 이런 일이 일어나는 걸까요? 파이프를 사용

답변

11

자식 프로세스 (제 2 커맨드)의 표준 입력 (입력)에, 제 커맨드의 출력 ( 표준 출력 )를 전송한다. 언급 한 명령은 stdin에서 아무런 입력도받지 않습니다. 이것은 (I 인수없이 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 */)