대용량 파일 목록의 총 파일 크기

대용량 파일 목록의 총 파일 크기

이 질문은 다음 질문과 매우 유사합니다.

파일 목록의 파일 크기의 합

사실 나의 모든 시도는 이 질문에 나열되어 있습니다.

차이점은 내 목록에 많은 수의 파일(1M+)이 있고 이러한 시도가 그렇게 많은 항목에서는 작동하지 않는 것 같습니다.

의 경우 stat다음 du오류가 발생합니다.

-bash: /usr/bin/stat: Argument list too long
-bash: /usr/bin/du: Argument list too long  

Perl 솔루션은 작동하는 것 같지만 속도가 매우 느리고 전체 목록을 처리할 수 있는지 아니면 충돌이 발생하는지 확실하지 않습니다.

원본 파일을 여러 부분으로 분할한 다음 해당 부분의 합계를 합산하지 않는 솔루션이 있습니까?

답변1

또는 (심볼릭 링크를 확인하려는 경우) 시스템 호출을 /some/dir/file사용하여 수행된 파일 크기를 확인하려면 시스템에 다음이 필요합니다.lstat()stat()

  • inode를 조회하고 이에 대한 읽기 및 검색 액세스 권한이 있는지 확인하고 /디렉터리 내용이 어디에 있는지에 대한 정보를 가져옵니다./
  • 내용을 읽고 그 안에 있는 항목을 /찾으십시오 (inode 번호를 얻으십시오).some
  • for 와 마찬가지로 inode에서 권한 등을 /확인하세요 ./some
  • for /some/dir및 for를 반복합니다./some/dir/file
  • /some/dir/file검색된 inode의 크기 속성

일부 경로 구성 요소가 심볼릭 링크인 경우 해당 구성 요소도 해결해야 합니다.

ACL이나 다른 보안 컨텍스트가 관련된 경우 검색이 더욱 복잡해집니다. 조회를 수행하면 root이 중 일부가 우회되어 프로세스 속도가 빨라질 수 있습니다.

따라서 stat()(또는 파일을 찾기 위한 시스템 호출) 비용이 많이 드는 작업이 될 수 있습니다. 특히 모든 데이터(inode 및 디렉터리의 내용과 보안 속성)가 메모리에 캐시되지 않고 시스템의 여러 위치에서 가져와야 하는 경우에는 더욱 그렇습니다. 검색하다. 하드 디스크.

디렉터리의 내용이 캐시되더라도 인덱싱되지 않은 큰 디렉터리에서 파일을 찾는 데 드는 비용은 상당히 높을 수 있습니다.

유용한 접근 방식은 동일한 디렉터리에 있는 파일이 서로 옆에 나열되도록 파일 목록을 정렬하고 특정 파일이 발견될 때 데이터가 캐시될 가능성을 최대화하는 것입니다.

또한 너무 많은 명령을 실행하거나 불필요한 추가 작업을 수행하는 것을 피하고 싶을 수도 있습니다.

그래서:

LC_ALL=C sort file | perl -lne '$s += -s} END {print $s'

(와 같이 root)은 아마도 쉽게 달성할 수 있는 가장 빠른 속도에 가깝습니다.

stat()(여기서 시스템 호출은 기호 링크의 경우 가리키는 파일의 크기를 고려하기 위해 사용됩니다 .)

이를 더욱 최적화하는 방법이 있습니다. 예를 들어 다음과 같은 경우가 있습니다.

/some/very/very/deep/dir/structure/with/many/levels/of/subdirs/file1
/some/very/very/deep/dir/structure/with/many/levels/of/subdirs/file2
/some/very/very/deep/dir/structure/with/many/levels/of/subdirs/file3
/some/very/very/deep/dir/structure/with/many/levels/of/subdirs/file4

open() /some/very/very/deep/dir/structure/with/many/levels/of/subdirs매번 모든 dir 구성 요소를 조회할 필요가 없도록 해당 디렉토리를 기준으로 fstatat()for file1, ... 한 번 수행하는 것이 더 빠를 수 있지만 file2이 최적화를 구현하는 것은 쉽지 않습니다(그렇게 간단하거나 어렵지는 않지만). .

데이터에 따라 일부 특정 최적화가 가능할 수도 있습니다. 예를 들어 파일이 여러 번 나열되는 경우 두 번째 및 추가 stat()파일을 최적화할 수 있습니다. /foo그것이 심볼릭 링크이고 아래에 수천 개의 동일한 파일이 있는 경우 /bar실제로 vs와 동일한 파일이라는 것을 알 수 있다면 일부를 최적화할 수 있습니다./foo/barstat()/foo/file/foo/./file/bar/../foo/file

관련 정보