여러 디렉터리/폴더 인수를 제공하는 경우( 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 /
질문
이것이 왜 중요합니까? 다시 세는 것이 아니라 내부적으로 계산하는 방식과 관련이 있지 않을까 생각했는데 놀랍게도 이 명령들은 완전히 다른 결과를 낳습니다.
주어진 인수 순서에 관계없이
du
항상 예상되는 3줄의 출력과 상위 디렉터리의 올바른 총 크기(예: 위의 174G)를 제공할 수 있는 방법이 있습니까 ?/
즉, 예상 출력은 다음과 같습니다.79G /home 30M /etc 174G /
나는 이것이 효율적이길 원합니다. 즉, 최상위 디렉터리를 한 번만 재귀적으로 순회하고 표시된 모든 하위 디렉터리에 대해 미리 계산된 정보를 재사용해야 합니다. 대신 find
+를 사용하여 xargs
여러 개의 별도 명령을 실행 하면 du
각 레벨의 하위 항목에 대해 계속해서 많은 재검색이 수행됩니다.
답변1
du
디스크 사용량을 보고합니다.
파일이 두 개의 다른 이름(하드 링크를 통해 포함)으로 발견된 경우에도 각 파일에 대해 한 번만 디스크 사용량을 계산합니다.
이는 동일한 파일에 대한 하드 링크 a
인 경우 에만 보고 되며 두 번째 파일을 처리할 때만 보고되며 이를 고려했음을 인식합니다.b
du a b
a
du b a
b
du
마찬가지로 du / /etc
내림차순 정렬 시 발견된 모든 파일은 /etc
이미 처리 시 고려되므로 /
보고할 내용이 없습니다 /etc
.
귀하의 경우 보고된 총 디스크 사용량은 항상 동일하고 일관성이 있습니다. 즉, 174G입니다. 이는 그 안에 있는 모든 파일이 사용하는 디스크 공간이기 때문입니다.
GNU 구현에서는 du
/ 옵션을 사용하여 중복 제거를 비활성화할 수 있습니다. 그러나 이러한 디렉터리의 누적 디스크 사용량은 더 이상 정확하지 않습니다(하드 링크가 있는 단일 디렉터리의 경우에도).-l
--count-links
/
누적 디스크 사용량 을 서로 /home
독립적 으로 얻으려면 다음 3번의 호출을 실행하세요 ./etc
du
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