이름으로 디렉토리를 선택하고 크기별로 목록을 정렬하십시오.

이름으로 디렉토리를 선택하고 크기별로 목록을 정렬하십시오.

.stversions특정 이름(예:)을 가진 모든 디렉토리를 찾고 크기별로 정렬된 목록을 얻고 싶습니다 . find -name .stversions디렉토리를 가져오고 du -hd1각 디렉토리의 크기를 결정하고 다음 sort -h을 사용하여 한 줄 명령에 넣을 수는 없습니다.

find -name .stversions | du -hd1 | sort -h

디렉터리를 선택하지 않는 것 같지만(명령은 단독으로 실행됨) 권한 거부에 대한 불만이 제기된 후 현재 디렉터리의 디렉터리 크기를 결정하고 정렬된 출력을 생성합니다. 출력 find을 에서 파이프로 연결하는 방법은 무엇입니까 du?

답변1

표준 du명령에는 입력이 필요하지 않습니다.표준 입력따라서 파이프로 연결해도 아무런 효과가 없습니다. (또한 처리하지 않습니다 -h. -d1) GNU 버전은 NUL로 구분된 파일 목록을 허용합니다(참고자료 참조 man du).

GNU를 사용하려는 경우 du파이프 전체에 NUL 종료 레코드를 사용할 수도 있습니다. 이렇게 하면 예기치 않은 문자(공백 포함)가 포함된 파일 이름(디렉터리 이름)을 처리할 수 있습니다.

find -type d -name '.stversions' -print0 | du -h -d1 --files-from0 - -0 | sort -z -h | tr '\0' '\n'

답변2

du텍스트 스트림을 처리하지 않으며 파일 이름 목록이 필요합니다. 즉, 해당 스트림에 파일 이름이 포함되어 있더라도 읽을 수 없기 때문에 텍스트 스트림을 단순히 파이프로 연결할 수 없다는 의미입니다. 따라서 두 가지 주요 옵션이 있습니다. i) xargs이런 종류의 도구를 사용하거나 ii) 파일 이름을 반복하여 전달하는 것 중 가장 간단한 방법입니다 du.xargs

find -name '.stversions' | xargs du -hd1 | sort -h 

그러나 경로에 공백 문자가 있는 경우 이 방법은 실패합니다. 더 강력한 솔루션은엠마 루오의 답변, 또는 GNU 도구를 사용하십시오.

find -type d -name '.stversions' -print0 | xargs -0 du -hd1 | sort -h 
            

관련 정보