du 명령에 대해 디렉토리/인덱스 디렉토리의 모든 파일을 제외합니다.

du 명령에 대해 디렉토리/인덱스 디렉토리의 모든 파일을 제외합니다.

내 목표는 매우 간단합니다. 큰 디렉터리에 있는 모든 파일/디렉터리의 작은 데이터베이스를 만들고 싶습니다.

적합한 도구를 검색한 결과 좋은 도구 외에는 아무것도 찾을 수 없었습니다 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은 파일 이름에 나타날 수 없는 유일한 바이트이기 때문입니다. 로케일에서 sedNUL 레코드 모드( )를 사용하여 -z이를 처리합니다 C(다시 말하지만 이는 사용자의 로케일에서 유효한 문자를 형성하지 않는 바이트 값을 포함하여 모든 바이트 값 """처리 할 수 있음). "레코드의 첫 번째 항목 뒤에 ( )를 추가하고 끝에 ( )를 추가합니다.,<size>$

trNL은 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).

관련 정보