디스크 사용량에 관계없이 디렉터리의 크기(모든 내용 포함)를 가져옵니다.

디스크 사용량에 관계없이 디렉터리의 크기(모든 내용 포함)를 가져옵니다.

일반적인 질문들

동일한 내용을 가진 두 개의 디렉토리가 서로 다른 장치에 저장되어 있다고 가정합니다. 디렉토리의 크기를 계산하고 항상 정확히 같은 숫자를 얻는 방법이 있습니까? 즉, 저장 위치에 관계없이 디렉토리의 "실제 크기"가 있습니까?

실제 사례

저는 두 개의 저장 장치 간에 디렉토리를 전송하는 데 사용합니다 rsync -ahP /dir1/ /dir2/. 전송이 성공적으로 완료된 후 du -s --apparent-size. 일부 디렉토리의 경우 두 장치 모두에서 정확히 동일한 번호를 얻었지만 전부는 아닙니다.

특정 문제

rsync디렉토리의 정확한 복사본을 생성하지 않고 선택한 옵션을 사용할 수 있습니까 ? 그렇다면 정확한 사본을 얻을 수 있는 방법이 있습니까?

저장 장치에 관계없이 사용된 명령은 du디렉터리의 "실제 크기"를 제공하지 않습니다. 그렇다면 그러한 치수를 계산하는 방법이 있습니까?

답변1

duGNU의 옵션에도 다음을 포함한 모든 유형의 파일에 대한 겉보기 크기(보고된 대로)가 포함 됩니다 --apparent-size.lstat()일반 파일,장비,심볼릭 링크,선입선출,목차. 다른 많은 구현과 마찬가지로 GNU는 du동일한 파일을 여러 번 계산하지 않으려고 합니다(예: 동일한 파일에 대한 하드 링크가 여러 개 있는 경우).

-H여기서는 에 옵션을 전달 하지 않기 때문에 rsync하드링크는 유지되지 않으므로, du소스에 하드링크가 존재할 경우 제외된 계정의 중복으로 인해 차이가 발생하게 됩니다.

유형 파일의 겉보기 크기목차실제 크기를 나타냅니다.데이터: 파일 이름 목록과 해당 파일을 찾을 수 있는 위치에 대한 정보입니다. 목록의 형식과 크기는 파일 시스템 유형, 구성 방법, 디렉터리를 채우는 방법에 따라 다릅니다.

장치 파일, fifo, 데이터를 전송하지 않는 소켓 의 경우 rsync일부 시스템(예: Linux)은 항상 겉보기 크기로 0을 반환하고 일부 시스템은 읽을 수 있는 데이터의 양을 반환합니다(예: 블록의 경우). 장치 파일), 이는 해당 저장소의 크기일 수 있음).

따라서 여기서 할 수 있는 최선의 방법은 겉보기 크기의 합을 계산하는 것입니다.정기적인그리고심볼릭 링크파일은 한 시스템에서 다른 시스템으로 일관됩니다.

GNU를 사용하여 이 작업을 수행할 수 있습니다 find.

find . -type f,l -printf '%s\n' | awk '{s+=$0}; END{print s}'

원본과 대상에서 동일한 번호가 발견되면 rsync모두 성공적으로 전송되었을 가능성이 높습니다.데이터(일반 파일의 내용과 심볼릭 링크(대상 경로)). 확장된 속성, ACL(옵션 -X을 전달하지 않기 때문에 -A두 메타데이터는 모두 보존되지 않음), 파일 이름, 빈 파일과 같은 모든 메타데이터를 성공적으로 전송하지 못할 수 있습니다.

디렉터리의 데이터 크기에 대한 일관된 표현으로(인코딩 문제가 없다고 가정 1) find . | wc -c(모든 파일 경로 길이의 합 + 1)을 사용할 수 있습니다.

(dry-run) 및 (verbose)를 사용하여 동일한 rsync명령을 다시 실행하여 누락된 콘텐츠를 확인할 수도 있고 소스 대신 대상에서 파일을 확인하기 위해 하나를 추가할 수도 있습니다.-n-v--delete


엄밀히 말하면, 특정 비ASCII 문자에 대한 문자 인코딩 변환의 경우, 특히 비Unix 또는 macOS 파일 시스템이 관련된 경우와 같이 파일 이름에 일부 변환이 수행되면 심볼릭 링크 크기가 달라질 수 있습니다.

답변2

Rsync 및 기타 도구는 디렉터리를 정확하게 복사하지 않습니다. 스파스 파일을 정확하게 복사할 수도 있고 복사하지 않을 수도 있습니다. 이것은아니요일반적으로 걱정해야 할 사항.

다음 bash 예제를 고려해보세요.

 mkdir -p /tmp/demo/a
 cd /tmp/demo/a
 touch {1..10000}
 ls -ld

이렇게 하면 10,000개의 파일이 생성되고 해당 파일이 저장된 디렉터리의 크기가 나열됩니다. 내 시스템에서는 155648바이트의 디렉토리 크기를 얻습니다. 이제 9,000개를 꺼내서 치수를 다시 확인해 보세요.

 rm ????
 ls -ld

내 디렉터리 크기는 155648바이트로 동일하게 유지됩니다. 이제 사본을 만드십시오. 여기서는 그것을 사용하고 있지만 복사된 파일 이거나 다른 것일 cp수도 있습니다 .rsynccpio

 cd ..
 cp -r a b
 ls -l

나에게 b디렉토리는 135,168바이트보다 작은 20,480바이트에 불과하다. 이는 a디렉토리에 삭제된 파일 3141에 대한 항목을 수용할 수 있는 공간이 있지만 b해당 공간이 할당되지 않았기 때문입니다.

관련 정보