"find -exec du"가 작동하지 않는 이유는 무엇입니까?

"find -exec du"가 작동하지 않는 이유는 무엇입니까?

"."로 시작하는 분기를 제외하고 디렉토리 트리의 디스크 사용량을 얻고 싶고 결국 ssh를 통해 실행하고 싶기 때문에 파이프를 사용하지 않는 것이 좋습니다. 다음 명령을 실행하면 모든 디렉터리 목록이 표시됩니다.

> /bin/find . \( -name .[^.]\* -prune \) -o \( -type d -exec /bin/echo -sh {} + \)
-sh ./dir-1 ./dir-2 ./dir-3 [...]

du를 단독으로 실행하면 예상되는 결과를 얻습니다.

> /bin/du -sh ./dir-1 ./dir-2 ./dir3 [...]
11M     ./dir-1
254K    ./dir-2
15M     ./dir-3
[...]

두 개를 결합하면 전체 행만 얻습니다.

> /bin/find . \( -name .[^.]\* -prune \) -o \( -type d -exec /bin/du -sh {} + \)
1.4G    .

그런데 저는 Oracle Linux Server 버전 7.9와 GNU bash, 버전 4.2.46(2)-릴리스(x86_64-redhat-linux-gnu)를 실행하고 있습니다.

답변1

요약할 때 du디렉터리는 한 번만 계산됩니다.

du -sh . somedir

점유되어 있기 .때문에 표시됩니다 . 순서가 중요하므로somedir.

du -sh somedir .

somedir과 동시에 표시되며 계산 .되지 않습니다 .somedir.

귀하의 find명령은 결국 을 포함하게 되며 ., 이것이 먼저 나오므로 이것이 표시됩니다. 최소 깊이를 지정하면 이를 방지할 수 있습니다. 그러면 현재 디렉터리 아래에 있는 모든 디렉터리의 전체 내용이 표시됩니다.

그게 당신이 원하는 거라면, 그럼요

du -sh */

을 사용하지 않고도 동일한 결과를 얻을 수 있습니다 find.

자세한 디렉터리별 출력을 원하는 경우 find디렉터리에 깊이 우선 나열을 지시해야 합니다. -prune이는 작동하지 않지만 경로 필터링은 다음과 같습니다.

find . -mindepth 1 -depth -type d \! -path '*/.*' -exec du -sh {} +

(숨겨진 디렉터리의 크기는 여전히 숨겨지지 않은 상위 ​​디렉터리의 크기에 포함됩니다.)

du이를 지원하는 경우 --exclude이를 사용하여 동일한 효과를 얻을 수 있습니다.

du -h --exclude '*/.*' ./

관련 정보