총 크기가 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) 한 번 실행됩니다 . 전자는;
find
du
많이더 빠르게.
인용스테판 차젤라스' 설명: " 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/exports
eg 는 인쇄되지만 /data/dataold/exports/foo
eg 는 인쇄되지 않습니다 /data/dataold/exports/foo/bar
.
답변2
요약하지 말고 du
작업을 수행하도록 하십시오. 주문에 sort
따라 적용한 -h
다음 특정 크기로 캡을 씌웁니다.
du -h /data/dataold/exports/ | sort -h
-r
in sort
을 역순으로 나열하는 데 사용합니다 (예: 큰 파일에서 작은 파일로).
크기를 선택하려면 다음과 같은 간단한 방법을 awk
사용하면 됩니다.
du -h /data/dataold/exports/ | awk -F'G' '$1~/^[0-9]+$/ && $1>=20' | sort -h
즉, G
(GB 크기 출력에서) 필드 구분 기호로 사용하고 필드가 숫자만 있는지 확인한 다음(G 구분 기호와 잘못된 일치를 제외하기 위해) 20보다 큰 숫자만 선택합니다. 여기서 정렬은 선택 사항입니다.