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실행을 방지 하고 하위 디렉토리의 하위 디렉토리(예: )에 대해 이를 방지합니다 .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. 를 사용하면 모든 파일/디렉토리에 대해 한 번 실행하는 +대신 Linux 인수 버퍼가 채워질 때마다(약 2MB) 한 번 실행됩니다 . 전자는;finddu많이더 빠르게.

인용스테판 차젤라스' 설명: " du( with 와 같은 find -exec)의 여러 독립적 호출을 호출하면 해당 최상위 디렉터리에 하드 링크가 있는 경우 다른 번호가 제공될 수 있습니다. 의 다른 호출로 발견되면 중복이 제거되지 않기 때문입니다 du."


GNU에서는 옵션 또는 du다음을 사용하여 표시할 깊이를 제한할 수 있습니다 .-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

-rin sort을 역순으로 나열하는 데 사용합니다 (예: 큰 파일에서 작은 파일로).

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

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

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

관련 정보