내 목표는 매우 간단합니다. 큰 디렉터리에 있는 모든 파일/디렉터리의 작은 데이터베이스를 만들고 싶습니다.
적합한 도구를 검색한 결과 좋은 도구 외에는 아무것도 찾을 수 없었습니다 du
. -b
파일이 실제로 가지고 있는 바이트 수를 원하고 모든 파일을 나열 하려면 -a
. 엄청난.
du
이제 문제는 출력에 디렉터리를 포함하고 싶지 않다는 것입니다 . 각 파일에 다음과 같은 출력이 있기를 바랍니다. size<tab>filename
따라서 이를 CSV나 일종의 데이터베이스로 변환할 수 있습니다. 디렉터리가 포함된 문제는 데이터베이스로 변환/가져온 후에 디렉터리를 파일에서 분리하는 방법을 모르고 실수로 파일을 디렉터리로 갖게 되거나 그 반대로 끝나는 것을 원하지 않는다는 것입니다. 또한 디렉토리의 모든 파일을 합산하면 이미 전체 디렉토리의 크기를 얻었고 그 위에 전체 디렉토리의 크기를 추가하면 사용된 전체 공간을 실수로 너무 많이 계산하는 일이 발생하고 싶지 않습니다. 그건 너무해요.
그래서 나는 사용하고 싶지 않습니다 find -type f
... (테스트 디렉토리에는 총 38,000개의 파일이 있고 실제 디렉토리에는 수백만 개가 있습니다)
$ time find -mindepth 1 -type f -exec du -sb {} > /dev/null \;
real 0m45.631s
user 0m25.807s
sys 0m18.946s
$ time du -ab > /dev/null
real 0m0.154s
user 0m0.057s
sys 0m0.096s
나는 원래 목표를 달성하기 위한 다른 방법에 대한 제안을 환영합니다.문제의 파일 시스템을 실제로 마운트하지 않고도 디렉토리를 "찾아보고" 크기(및 포함된 파일의 크기)를 확인할 수 있는 방법이 필요합니다. (일종의 "오프라인" Baobab과 비슷하다고 말할 수 있음)
답변1
du
파일 크기가 아닌 파일의 디스크 사용량이 보고된다는 점에 유의하세요 ( --apparent-size
옵션의 GNU 구현 du
(또는 -b
짧은 다른 GNU 확장자 --apparent-size --block-size=1
)을 사용하지 않는 한).
또한 파일 이름의 ,
, TAB , 줄 바꿈 또는 기타 문자는 Unix 계열 시스템에서와 마찬가지로 유효합니다."
GNU 시스템에서는 다음을 수행할 수 있습니다.
find . ! -type d -printf '%s,%P\0' |
LC_ALL=C sed -z 's/"/""/g; s/,/,"/; s/$/"/' |
tr '\0' '\n'
디렉터리 유형을 제외한 모든 파일의 크기를 CSV 형식으로 출력하고 보고합니다.
find
위에서 NUL로 구분된 레코드를 출력하도록 지시했습니다 <size>,<filepath>
. 0은 파일 이름에 나타날 수 없는 유일한 바이트이기 때문입니다. 로케일에서 sed
NUL 레코드 모드( )를 사용하여 -z
이를 처리합니다 C
(다시 말하지만 이는 사용자의 로케일에서 유효한 문자를 형성하지 않는 바이트 값을 포함하여 모든 바이트 값 "
을 ""
처리 할 수 있음). "
레코드의 첫 번째 항목 뒤에 ( )를 추가하고 끝에 ( )를 추가합니다.,
<size>
$
tr
NL은 CSV의 레코드 구분 기호이므로 이 출력의 NUL을 NL로 변환합니다. 예를 들어, 이라는 15바이트 파일은 다음 $'a\nb"c'
과 같이 렌더링됩니다.
15,"a
b""c"
이것이 실제로 원하는 디스크 사용량이라면 이를 512바이트 또는 킬로바이트 단위의 디스크 사용량 %s
으로 대체할 수 있습니다 .%b
%k
GNU 시스템( GNU 확장인 )이 아닌 경우 다음을 -printf
사용할 -z
수 있습니다 perl
.
find . ! -type d -print0 |
perl -l -0ne '
if (@s = lstat$_) {
s/"/""/g; print qq($s[7],"$_")
} else {warn "$_: $!\n"}'
( -print0
또한 GNU 확장이지만 요즘에는 대부분의 다른 find
구현에 나타납니다. 그렇지 않은 경우 사용할 수 있습니다 -exec printf '%s\0' {} +
).
이번에는 512바이트의 디스크 사용량을 원하시면 교체하세요 7
.12
그럼에도 불구하고 디렉터리(파일 이름 목록과 inode에 대한 매핑을 포함하는 특수한 유형의 파일) 자체에는 크기가 있다는 점에 유의하십시오. 인스턴스가 보고하는 디렉터리의 누적 디스크 사용량은 du -s some-dir
디렉터리에서 반복적으로 참조하는 모든 고유 파일(디렉터리 포함 모든 유형)의 디스크 사용량에 디렉터리 자체의 크기를 더한 합계입니다.
여기에서 du
작업을 수동으로 수행하고 동일한 크기를 보고할 수 있으려면 디렉터리 파일의 디스크 사용량/크기도 기록해야 하며, 동일한 파일로 파일이 복제될 때(여러 파일이 있는 경우) 기록해야 합니다. 파일 이름, 일명하드 링크). 따라서 크기/디스크 사용량 및 파일 경로 외에도 %D:%i
파일의 고유 식별자인 파일 장치 및 inode 번호( )도 기록해야 합니다. 이를 통해 du
두 파일 경로가 동일한 파일을 참조하는지 알 수 있습니다.
파일 유형을 기록할 수도 있습니다. 그리고목차다양한 유형의 파일 중 하나일 뿐입니다. 게다가정기적인문서,심볼릭 링크,선입선출,장비,소켓... ( %y
).