`du` 명령으로 특정 확장자의 총 파일 크기 만 표시하는 방법 파일의 전체 크기를 알고 싶습니다. 명령으로

디렉토리에 수백 개의 pdf 파일과 html 파일이 있습니다. 그리고 PDF 파일의 전체 크기를 알고 싶습니다.

명령으로 du -ch /var/foo총 파일 크기를 볼 수 있지만 총 크기 인 마지막 줄만 필요합니다.

디렉토리에 pdf 파일 만 포함되어 있으면 -s옵션을 사용할 수 있지만 이번에는 옵션을 사용할 수 없습니다.

특정 파일 형식의 총 크기 만 얻으려면 어떻게해야합니까?



답변

GNU du(즉, 내장되지 않은 Linux 또는 Cygwin)에서는 --exclude옵션을 사용하여 일치하지 않는 파일을 제외 할 수 있습니다 .

du -s --exclude='*.html' /var/foo

*.pdf파일 을 정확하게 일치 시키려면 다른 방법을 사용하여 파일을 나열해야 du하며 인수 당 하나 이상의 출력 행과 옵션으로 총계를 표시해야합니다 -c. tail마지막 줄을 제외한 모든 줄을 제거하거나“total”단어를 제거하기 위해 sed를 호출 할 수 있습니다 . 한 디렉토리에있는 파일을 열거하려면 쉘에서 와일드 카드를 사용하십시오.

du -sc /var/foo/*.pdf | tail -n1
du -sc /var/foo/*.pdf | sed -n '$s/\t.*//p'

서브 디렉토리에서도 파일을 탐색해야하는 경우, 쉘이 지원하는 경우을 find사용하거나 **/패턴을 사용하십시오. 를 들어 **/, bash는, 첫 번째 실행에서 shopt -s extglob, 그리고 4.2까지의 bash 버전이 디렉토리에 심볼릭 링크를 통과 않습니다; zsh에서는 즉시 작동합니다.

du -sc /var/foo/**/*.pdf | tail -n1

찾기 버전과 관련된 추가 문제는 너무 많은 파일이있는 경우 명령 줄 길이 제한을 유지하기 위해 두 번 이상 find실행 du됩니다. 와일드 카드 방법을 사용하면 이러한 오류가 발생하면 오류가 발생합니다 ( “명령 줄 길이 제한 초과”). 다음 코드는 개행을 포함하는 일치하는 파일 이름이 없다고 가정합니다.

find /var/foo -name '*.pdf' -exec du -sc {} + |
awk '$2 == "total" {total += $1} END {print total}'


답변

쉘이 파일을 확장하도록 할 수 있습니다 :

$ mkdir foo
$ echo "abc" > foo/1.pdf
$ echo "abcd" > foo/2.pdf
$ echo "abcd" > foo/3.html
$ du -ch foo/*.pdf
4,0K    foo/1.pdf
4,0K    foo/2.pdf
8,0K    total

그러나 당신이 볼 수 있듯이 이것은 방금 만든 것처럼 파일 크기를 약 1000 배 나타냅니다. 더 나은 옵션은 다음 -b옵션을 사용하는 것입니다.

$ du -cbh foo/*.pdf
4   foo/1.pdf
5   foo/2.pdf
9   total

큰 파일 크기는 여전히 사람이 읽을 수있는 형태로 표시됩니다 (예 🙂 173K.


답변