Oracle Linux 6.7 -bash: /usr/bin/du: 매개변수 목록이 너무 깁니다.

Oracle Linux 6.7 -bash: /usr/bin/du: 매개변수 목록이 너무 깁니다.

총 크기가 300GB인 약 100만 개의 폴더에 대한 경로가 있습니다. 명령 을 실행하면 du -sh *제목에 언급된 오류가 발생합니다. 이 명령을 어떻게 결합할 수 있습니까 ? xargs아니면 xargs문제가 해결됩니까? 그러나 동일한 경로에서 20GB보다 큰 폴더를 찾으려면 여전히 별도의 명령이 필요합니다. 이 두 명령을 사용하는 데 도움이 필요합니다.

경로 예:/data/dataold/exports/

출력은 다음과 같아야 합니다. 아래에서 말하는 내용은 이전 줄에서 지정한 홈 경로 아래의 파일 및 폴더 이름으로 생각할 수 있습니다.

4.0K xyz.sh
12K asdasda.txt
10G QWERT
1G ASDFGH

감사합니다.

답변1

한 가지 옵션은 을 사용하는 것이지만 find아래 표시된 다른 솔루션 중 하나를 사용하는 것이 좋습니다.

find /data/dataold/exports -mindepth 1 -maxdepth 1 -exec du -sh {} \;

/data/dataold/exports하위 디렉터리가 포함되어 있다고 가정

foo
bar
baz

(어쩌면 그 이상) 실행될 것입니다.

du -sh /data/dataold/exports/foo
du -sh /data/dataold/exports/bar
du -sh /data/dataold/exports/baz

등.

옵션은 에 대한 명령 -mindepth실행을 방지하고 하위 디렉토리의 하위 디렉토리에서 for와 같은 명령 실행을 방지합니다 .du/data/dataold/exports-maxdepth/data/dataold/exports/foo/something

제안대로카스' 댓글을 사용하면 됩니다.

find /data/dataold/exports -mindepth 1 -maxdepth 1 -exec du -sh {} \+

대신 ... -exec du -sh {} \;, 귀하의 버전이 find이 기능을 지원하는 경우. +대신 을 사용하면 각 파일/디렉토리에 대해 한 번이 아니라 ;버퍼가 가득 찰 때마다(약 2MB) Linux 인수 버퍼가 한 번 실행됩니다 . 전자는finddu많은서둘러요.

인용하다스티븐 차제라스' 참고: "이러한 최상위 디렉터리 사이에 하드 링크가 있는 경우 여러 개의 독립적인 호출 du(예: 데이터 중복 제거 수행)을 호출합니다."find -execdu


duGNU를 사용하면 다음 옵션을 사용하여 표시할 깊이를 제한 할 수 있습니다 .-d--max-depth=N

du -h -d 1 /data/dataold/exports

이는 모든 하위 디렉터리를 계산하지만 출력을 시작점 아래의 깊이 1로 제한하므로 위에 표시된 예에서는 전체 크기를 인쇄해야 합니다.

/data/dataold/exports/foo
/data/dataold/exports/bar
/data/dataold/exports/baz

등등 그리고

/data/dataold/exports

du두 번째 솔루션(사용 가능한 경우)이 선호되어야 합니다. 왜냐하면 매개변수 버퍼를 채우기 위해 각 하위 디렉터리(의 경우 ) 또는 각 하위 디렉터리 집합에 대해 새 프로세스를 시작할 필요가 없기 때문입니다 -exec ... \;(의 경우 -exec ... \+).

귀하의 버전이 사용할 수 있는 옵션을 du지원하지 않는 경우-d

du -h /data/dataold/exports

그리고 출력을 필터링하여 하위 디렉터리의 첫 번째 수준 아래에 있는 모든 항목을 제거합니다.


수치 비교를 통해 출력을 필터링하려면 이 옵션을 생략하는 것이 좋습니다 -h. 필터링을 테스트할 때 느린 파일 시스템 액세스를 기다리지 않으려면 출력을 파일로 리디렉션하는 것이 좋습니다.

du -d 1 /data/dataold/exports > outputfile

또는

du -d 1 /data/dataold/exports 2>errors | tee outputfile

다음 내용을 처리합니다 outputfile.

예:

awk '$1 > 20e9` outputfile

du옵션을 지원하지 않으면 다음 -d과 같은 것을 사용할 수 있습니다

du /data/dataold/exports > outputfile
awk '$1 > 20e9 && $1 != /\/.*\/.*\/.*\/.*\/.*/` outputfile

이렇게 하면 첫 번째 필드의 숫자가 20 * 10^9보다 크고 두 번째 필드의 값에 슬래시가 5개(또는 그 이상) 포함되지 않은 모든 행이 인쇄됩니다. 두 번째 조건의 슬래시 수는 시작 디렉토리에 따라 사용자 정의되며 /data/dataold/exportseg는 인쇄되지만 /data/dataold/exports/fooeg는 인쇄되지 않습니다 /data/dataold/exports/foo/bar.

답변2

요약하지 말고 du작업이 완료되도록 하십시오. sort사용자 주문별로 적용한 -h다음 특정 크기로 제한합니다.

du -h /data/dataold/exports/ | sort -h

가장 큰 것부터 가장 작은 것까지 -r역순 으로 파일을 나열하는 데 사용됩니다 .sort

크기를 선택하려면 다음과 awk같은 간단한 방법을 사용할 수 있습니다.

du -h /data/dataold/exports/ | awk -F'G' '$1~/^[0-9]+$/ && $1>=20' | sort -h 

즉, GGB 크기 출력에서 ​​필드 구분 기호로 사용하고 필드에 숫자만 있는지 확인한 다음(G 구분 기호와 잘못된 일치를 제외하기 위해) 20보다 큰 숫자만 선택합니다. 여기서 정렬하는 것은 선택 사항입니다.

관련 정보