"du -s" 명령에서 매개변수 순서가 중요한 이유는 무엇입니까? 그리고 순서에 관계없이 어떻게 일관되게 만들 수 있나요?

"du -s" 명령에서 매개변수 순서가 중요한 이유는 무엇입니까? 그리고 순서에 관계없이 어떻게 일관되게 만들 수 있나요?

여러 디렉터리/폴더 인수를 제공하는 경우( du -s그 중 일부는 다른 인수의 상위 인수) 인수의 순서는 해당 인수 du가 출력에 표시되는지 여부에 따라 달라집니다. 또한 상위 디렉터리의 표시 크기도 변경됩니다.

예를 들어, 다음 3개 디렉터리의 요약을 보고 싶다고 가정해 보겠습니다.

/ (actual size: 174G)
/etc
/home

명령 #1

✔️아래 첫 번째 명령이 올바르게 제공되었으므로 3줄의 출력이 표시될 것으로 예상했습니다.

그러나 /의 크기는 표시된 하위 디렉터리의 크기를 뺀 크기이므로 잘못된 것입니다./

du -sh /home /etc /

79G     /home
30M     /etc
95G     /

명령 #2

그러나 인수의 순서가 다르고 상위 디렉터리가 하위 디렉터리보다 먼저 지정되면 하위 디렉터리가 전혀 표시되지 않습니다.

3개의 디렉터리 매개변수가 있으며 2개만 표시됩니다.

또한 for의 크기는 from /의 크기를 빼기 때문에 잘못된 것입니다./home/

du -sh /home / /etc

79G     /home
95G     /

명령 #3

3개의 디렉터리 매개변수 중 1개만 표시됩니다.

✔️ /올바른 전체 크기를 표시합니다.

du -sh / /home /etc

174G    /

질문

  1. 이것이 왜 중요합니까? 다시 세는 것이 아니라 내부적으로 계산하는 방식과 관련이 있지 않을까 생각했는데 놀랍게도 이 명령들은 완전히 다른 결과를 낳습니다.

  2. 주어진 인수 순서에 관계없이 du항상 예상되는 3줄의 출력과 상위 디렉터리의 올바른 총 크기(예: 위의 174G)를 제공할 수 있는 방법이 있습니까 ? /즉, 예상 출력은 다음과 같습니다.

    79G    /home
    30M    /etc
    174G   /
    

나는 이것이 효율적이길 원합니다. 즉, 최상위 디렉터리를 한 번만 재귀적으로 순회하고 표시된 모든 하위 디렉터리에 대해 미리 계산된 정보를 재사용해야 합니다. 대신 find+를 사용하여 xargs여러 개의 별도 명령을 실행 하면 du각 레벨의 하위 항목에 대해 계속해서 많은 재검색이 수행됩니다.

답변1

du디스크 사용량을 보고합니다.

파일이 두 개의 다른 이름(하드 링크를 통해 포함)으로 발견된 경우에도 각 파일에 대해 한 번만 디스크 사용량을 계산합니다.

이는 동일한 파일에 대한 하드 링크 a인 경우 에만 보고 되며 두 번째 파일을 처리할 때만 보고되며 이를 고려했음을 인식합니다.bdu a badu b abdu

마찬가지로 du / /etc내림차순 정렬 시 발견된 모든 파일은 /etc이미 처리 시 고려되므로 /보고할 내용이 없습니다 /etc.

귀하의 경우 보고된 총 디스크 사용량은 항상 동일하고 일관성이 있습니다. 즉, 174G입니다. 이는 그 안에 있는 모든 파일이 사용하는 디스크 공간이기 때문입니다.

GNU 구현에서는 du/ 옵션을 사용하여 중복 제거를 비활성화할 수 있습니다. 그러나 이러한 디렉터리의 누적 디스크 사용량은 더 이상 정확하지 않습니다(하드 링크가 있는 단일 디렉터리의 경우에도).-l--count-links

/누적 디스크 사용량 을 서로 /home독립적 으로 얻으려면 다음 3번의 호출을 실행하세요 ./etcdu

du -s /
du -s /home
du -s /etc

또는 zsh:

for d (/ /home /etc) du -s $d

/home그럼에도 불구하고 외부에 하드 링크가 있는 파일이 있는 경우 해당 파일 /home과 해당 콘텐츠를 모두 삭제해도 보고된 만큼의 공간이 반드시 확보되지는 않습니다 du.

답변2

du명령은 파일이나 디렉터리를 여러 번 계산하는 것을 피하기 위해 매우 길어집니다. 이것은에서 온 것입니다POSIX 정의어느 상태,

파일 피연산자 아래에서 여러 번 발생하고 링크 수가 1보다 큰 파일은 하나의 항목에 대해서만 계산되고 기록되어야 합니다. 링크 수가 1 이하인 파일이 한 번만 계산되고 기록되는지 아니면 발생할 때마다 기록되는지 여부는 구현에 따라 정의됩니다. 하나의 파일 피연산자 아래에 나타나는 파일이 다른 파일 피연산자로 계산되는지 여부는 구현에 따라 정의됩니다.

GNU의 경우 du명령을 사용하여 du -sh /home /사용된 공간을 확인한 /home다음 사용된 공간을 확인합니다./ 이미 방문한 장소는 제외du.

du세 개의 디렉터리 계층 구조 예에 대해 완전히 독립적인 값을 원할 경우 이를 세 번 호출해야 합니다 .

du -sh /
du -sh /home
du -sh /etc

관련 정보