다른 곳에 하드 링크되지 않은 파일이 사용하는 공간만 "du"하는 방법은 무엇입니까?

다른 곳에 하드 링크되지 않은 파일이 사용하는 공간만 "du"하는 방법은 무엇입니까?

rsync --link-dest공간 절약을 위한 스냅샷, 실제로 얼마나 많은 공간을 절약하는지 어떻게 알 수 있나요? 또는 더 일반적으로:

다른 곳에 하드 링크되지 않은 파일만 고려하여 디렉토리가 사용하는 공간을 계산하는 방법외부디렉토리 구조? 다른 방식으로 질문합니다. 이 디렉토리를 삭제하면 실제로 얼마나 많은 공간이 확보됩니까? ( du -hs아마도 거짓말일 것입니다. 하드 링크 자체에 필요한 공간이 포함될 수 있습니다)

답변1

내부 하드 링크가 없다고 가정하면(즉, 2개 이상의 하드 링크가 있는 모든 파일이 트리 외부에서 링크됨) 다음을 수행할 수 있습니다.

find . -links -2 -print0 | du -c --files0-from=-

편집하다이것이 제가 리뷰에서 설명하고 적용한 것입니다. 아니요 . 이것이 필요하지 않다는 du사실을 알아차린 @StephaneChazelas에게 감사드립니다 . du마지막에 설명.

( find . -type d -printf '%k + ' ; \
  find . \! -type d -printf '%n\t%i\t%k\n' | \
    sort | uniq -c                         | \
    awk '$1 >= $2 { print $4 " +\\" }' ; \
  echo 0 ) | bc

우리가 원하는 것은 더하기 기호로 구분된 각 관련 파일의 디스크 사용량(KB)을 포함하는 문자열을 만드는 것입니다. 그런 다음 우리는 이 큰 보충제를 bc.

첫 번째 find호출에서는 디렉터리에 대해 이 작업을 수행합니다.

두 번째는 find링크 수, inode 및 디스크 사용량을 인쇄합니다. sort | uniq -c목록(트리의 발생 횟수, 링크 수, inode, 디스크 사용량)을 가져오기 위해 이 목록을 전달합니다 .

우리는 통과저것첫 번째 필드(발생 횟수) 가 awk두 번째 필드(하드 링크 수)보다 크거나 같으면 즉, 트리 외부에서 파일에 대한 링크가 없음을 의미하며 네 번째 필드(디스크 사용법)은 더하기 기호와 백슬래시와 함께 인쇄됩니다.

마지막으로 a 를 출력하므로 0수식이 구문상 정확하므로(그렇지 않으면 en 이 됩니다 +) 이를 에 전달합니다 bc.

(하지만 충분한 답변을 얻을 수 있다면 더 간단한 첫 번째 접근 방식을 사용하겠습니다.)

답변2

기본적으로 모든 파일(디렉토리 아님)에 대한 inode 번호와 링크 수를 가져와서 해당 링크 수를 각 inode의 발생 횟수와 비교하고, 서로 다른 경우 파일을 제외해야 합니다.

둘 다 동일한 파일 시스템에 있다고 가정하면 다음과 같이 작동합니다(GNU find 사용).

find . -type d -printf '%k\n' -o -printf '%i %n %k\n' |
   awk '
     NF==1{t+=$0; next}
     {n1[$1]=$2; n2[$1]++; s[$1]=$3}
     END {
       for (i in n1)
         if (n1[i] == n2[i])
           t+=s[i]
       print t
     }'

답변3

du실제로 거짓말은 하지 않을 것입니다. ;) 동일한 inode를 가리키는 모든 하드 링크 중 첫 번째 링크만 계산하여 해당 디렉토리를 확인합니다.

단 하나의 디렉토리에서 무엇을 보는지 묻는다면 du동일한 콘텐츠를 가리키는 다른 하드 링크가 있는지 여부는 상관하지 않습니다.

$ du -h daily.0 && du -hc daily.1
29G /daily.0
29G /daily.1

이제 해당 디렉터리를 같은 줄에 배치합니다(가장 최근의 rsync 증분 백업부터 시작 --link-dest).

$ du -hc daily.0 daily.1
29G /daily.0
364M /daily.1
29G total

또는 전체 백업 디렉터리:

$ du -hc --max-depth=1 /snapshots
29G /daily.0
364M /daily.1
537M /daily.2
333M /daily.3
30G total

"daily.0"에서 이미 참조된 inode(일명 "실제" 파일)를 참조하는 "daily.1"의 모든 파일은 계산되지 않습니다.

따라서 daily.1을 삭제하면 기기 공간이 364MB 절약됩니다.

제거하다

관련 정보