a 를 만족하는 파일의 전체 크기를 얻으려고 합니다 find
. 예를 들면 다음과 같습니다.
ls $(find -maxdepth 2 -type f)
그러나 이 호출은 ls
전체 크기도 생성하지 않습니다.
답변1
믿거나 말거나, find
및 를 사용하여 이를 달성 할 수 있습니다 du
. 나는 이전에 블로그에 올렸던 비슷한 기술을 사용했습니다. 해당 기사의 제목은 다음과 같습니다.[한 줄]: du를 사용하여 Linux에서 파일 목록의 디스크 공간 사용량을 계산합니다..
게시물의 요점은 다음 명령입니다.
$ find -maxdepth 2 -type f | tr '\n' '\0' | du -ch --files0-from=-
예
요약 전체와 함께 모든 파일의 크기가 나열됩니다.
$ find -maxdepth 2 -type f | tr '\n' '\0' | du -ch --files0-from=- | tail -10
0 ./92086/2.txt
0 ./92086/5.txt
0 ./92086/14.txt
0 ./92086/19.txt
0 ./92086/18.txt
0 ./92086/17.txt
4.0K ./load.bash
4.0K ./100855/plain.txt
4.0K ./100855/tst_ccmds.bash
21M total
노트:내가 아는 한, 이 솔루션에는 GNU 스위치 du
에 대한 지원이 필요합니다.--files0-from=
du 매뉴얼 페이지에서 발췌
--files0-from=F
summarize disk usage of the NUL-terminated file names specified in
file F; If F is - then read names from standard input
또한 이 메서드는 공백, 인쇄할 수 없는 문자 등 파일 이름의 특수 문자를 처리할 수 없습니다.
예
du: cannot access `./101415/fileD': No such file or directory
du: cannot access `E': No such file or directory
tr .. ..
이러한 문제는 대체 문자로 바꾸는 더 많은 명령을 도입하여 해결할 수 있습니다. 그러나 GNU의 find
.
개선하다
귀하의 버전이 find
이 --print0
스위치를 제공하는 경우 이 주문을 사용하여 인쇄할 수 없는 공백 및/또는 특수 문자가 포함된 파일을 처리할 수 있습니다.
$ find -maxdepth 2 -type f -print0 | du -ch --files0-from=- | tail -10
0 ./92086/2.txt
0 ./92086/5.txt
0 ./92086/14.txt
0 ./92086/19.txt
0 ./92086/18.txt
0 ./92086/17.txt
4.0K ./load.bash
4.0K ./100855/plain.txt
4.0K ./100855/tst_ccmds.bash
21M total
답변2
du
(디스크 사용량) 파일이 차지하는 공간을 계산합니다. 찾은 파일을 전달하고 요약( -c
)하고 -h
바이트 수 대신 사람이 읽을 수 있는 형식( )으로 인쇄하도록 지시합니다. 그러면 모든 파일의 크기와 전체 크기를 얻을 수 있습니다. 마지막 행에만 관심이 있다면 tail
이렇게 할 수 있습니다.
find
파일 이름의 공백도 처리하기 위해 인쇄 및 예상 구분 기호는 xargs
일반적인 공백 대신 null 기호로 설정됩니다.
find -maxdepth 2 -type f -print0 | xargs -0 du -ch | tail -n1
최대 인수 수를 초과하는 많은 파일을 찾을 것으로 예상되면 xargs는 해당 파일을 여러 du
호출로 분할합니다. 그런 다음 tail
a로 대체하여 해결할 수 grep
있으며 요약 줄만 표시됩니다.
find -maxdepth 2 -type f -print0 | xargs -0 du -ch | grep -P '\ttotal$'
답변3
또 다른 접근 방식: 파일 이름이 아닌 파일 크기만 필요하므로 "CR이 포함된 이름, 공백이 포함된 이름 등"과 같은 "이상한" 파일 이름을 제거할 수 있습니다.
find /some/path -maxdepth 2 -type f -ls -exec printf '\000' \; \
| tr -cd ' -~\000' \
| tr '\000' '\n' \
| awk '{ sum+=$7 } END { print "total size: ",sum }'
비결은 다음과 같습니다.
1) 각 파일의 "-ls" 출력과 "\000" 문자를 인쇄합니다(다음 줄에 있지만 문제가 되지 않습니다. 2단계 참조)
.모든 것이 "ASCII 인쇄 불가능"입니다.('\t' 및 '\n' 포함. 그러나 우리는 또한\000"일반" 인쇄 가능한 ASCII 외에도 각 파일의 줄이 끝나는 위치를 알아야 하기 때문에 ASCII가 필요합니다! ). 이렇게 하면 파일 이름에 더 이상 특이한 사항이 없습니다("\n" 없음, "\t" 없음, ";" 없음 등). 또한 파일 크기인 "-ls"의 7번째 필드를 알아내기 위해 이러한 공백이 필요하기 때문에 공백을 유지합니다.
3) 추가된 '\000'을 '\n'으로 변환합니다(2단계). 또한 제거합니다. 일부 파일 이름에도 포함되어 있는 경우 이를 포함하십시오! )
4) 그런 다음 일곱 번째 열을 추가하여 최종 크기를 바이트 단위로 얻습니다.
이것은 이식성이 매우 뛰어납니다("-print0" 등이 필요하지 않음).
답변4
find -maxdepth 2 -type f --print0 | xargs -0 du -ch