문제

여러 폴더에 일부 파일이 있습니다.

/home/d/folder1/a.txt
/home/d/folder1/b.txt
/home/d/folder1/c.mov
/home/d/folder2/a.txt
/home/d/folder2/d.mov
/home/d/folder2/folder3/f.txt

/home/d/에 있는 모든 .txt 파일이 차지하는 전체 디스크 공간을 어떻게 측정할 수 있나요?

알아요 du는 나에게 주어진 폴더의 전체 공간을 줄 것입니다, 그리고 ls -l은 개별 파일의 전체 공간을 제공합니다., 하지만 모든 txt 파일을 합산하고 하나의 거대한 총계에서 모든 .txt 파일이 차지하는 공간 폴더1과 폴더2 및 폴더3과 같은 하위 폴더를 포함하여/home/d/의 모든 .txt에 대해?

도움이 되었습니까?

해결책

이것은 할 것입니다 :

total=0
for file in *.txt
do
    space=$(ls -l "$file" | awk '{print $5}')
    let total+=space
done
echo $total

다른 팁

find folder1 folder2 -iname '*.txt' -print0 | du --files0-from - -c -s | tail -1

이렇게하면 디스크 공간 사용이 확장 기준으로 바이트로보고됩니다.

find . -type f -printf "%f %s\n" |
  awk '{
      PARTSCOUNT=split( $1, FILEPARTS, "." );
      EXTENSION=PARTSCOUNT == 1 ? "NULL" : FILEPARTS[PARTSCOUNT];
      FILETYPE_MAP[EXTENSION]+=$2
    }
   END {
     for( FILETYPE in FILETYPE_MAP ) {
       print FILETYPE_MAP[FILETYPE], FILETYPE;
      }
   }' | sort -n

산출:

3250 png
30334451 mov
57725092729 m4a
69460813270 3gp
79456825676 mp3
131208301755 mp4

단순한:

du -ch *.txt

총 공간이 나타나기를 원한다면 다음과 같습니다.

du -ch *.txt | tail -1

다음은이를 수행하는 방법입니다 (Linux에서 GNU Coreutils 사용 du 및 Bash Syntax), 피하기 나쁜 연습:

total=0
while read -r line
do
    size=($line)
    (( total+=size ))
done < <( find . -iname "*.txt" -exec du -b {} + )
echo "$total"

현재 디렉토리를 제외하려면 사용하십시오. -mindepth 2 ~와 함께 find.

Bash Syntax가 필요하지 않은 다른 버전 :

find . -iname "*.txt" -exec du -b {} + | awk '{total += $1} END {print total}'

이것들은 NewLines를 포함하는 파일 이름으로 제대로 작동하지 않습니다 (그러나 공간이있는 사람은 작동합니다).

맥 OS

  • 도구를 사용하십시오 du 그리고 매개 변수 -I 다른 모든 파일을 제외합니다

리눅스

-X, --exclude-from=FILE
              exclude files that match any pattern in FILE

--exclude=PATTERN
              exclude files that match PATTERN

GNU 찾기,

find /home/d -type f -name "*.txt" -printf "%s\n" | awk '{s+=$0}END{print "total: "s" bytes"}'

Ennuikiller를 바탕으로 이름으로 공간을 처리합니다. 이 작업을 수행하고 약간의보고를 받아야했습니다.

-type f -name "*.wav"|를 찾으십시오 Grep Export | ./calc_space

#!/bin/bash
# calc_space
echo SPACE USED IN MEGABYTES
echo
total=0
while read FILE
do
    du -m "$FILE"
    space=$(du -m "$FILE"| awk '{print $1}')
    let total+=space
done
echo $total

Bash에 GNU 도구가있는 사람을위한 하나의 라이너 :

for i in $(find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u); do echo "$i"": ""$(du -hac **/*."$i" | tail -n1 | awk '{print $1;}')"; done | sort -h -k 2 -r

ExtGlob을 활성화해야합니다.

shopt -s extglob

도트 파일이 작동하려면 실행해야합니다.

shopt -s dotglob

샘플 출력 :

d: 3.0G
swp: 1.3G
mp4: 626M
txt: 263M
pdf: 238M
ogv: 115M
i: 76M
pkl: 65M
pptx: 56M
mat: 50M
png: 29M
eps: 25M

나는 xargs와 함께 Find를 사용하는 것을 좋아합니다.

find . -name "*.txt" -print0 |xargs -0 du -ch

그랜드 총계 만보고 싶다면 꼬리 추가

find . -name "*.txt" -print0 |xargs -0 du -ch | tail -n1

주어진 경로 및 하위 디렉토리에서 모든 텍스트 파일의 총 크기를 얻는 솔루션 (Perl OneLiner 사용)

find /path -iname '*.txt' | perl -lane '$sum += -s $_; END {print $sum}'

명령 줄에서 MacOS 로이 작업을 수행하려는 사람이라면 Printf 대신 -print0 인수에 따라 변형이 필요합니다. 위의 답변 중 일부는이를 다루지 만 연장에 의해 포괄적으로 수행됩니다.

    find . -type f -print0 | xargs -0 stat -f "%N %i" |
  awk '{
      PARTSCOUNT=split( $1, FILEPARTS, "." );
      EXTENSION=PARTSCOUNT == 1 ? "NULL" : FILEPARTS[PARTSCOUNT];
      FILETYPE_MAP[EXTENSION]+=$2
    }
   END {
     for( FILETYPE in FILETYPE_MAP ) {
       print FILETYPE_MAP[FILETYPE], FILETYPE;
      }
   }' | sort -n

허용되는 답변에는 몇 가지 잠재적인 문제가 있습니다.

  1. (다음과 같은 비표준 쉘 기능에 의존하지 않고) 하위 디렉토리로 내려가지 않습니다. globstar)
  2. 일반적으로 아래 Dennis Williamson이 지적한 것처럼 다음을 피해야 합니다. 출력을 구문 분석하는 중 ls
    • 즉, 사용자 또는 그룹(열 3 및 4)에 공백이 있는 경우 열 5는 파일 크기가 아닙니다.
  3. 그러한 파일이 백만 개 있으면 이것이 생성됩니다 백만 개의 서브쉘, 그러면 정말 엄청날 거야

처럼 ghostdog74가 제안한, GNU 특정을 사용할 수 있습니다 -printf 옵션 find 과도한 파이프, 서브쉘, Perl 및 이상한 모든 것을 피하면서 보다 강력한 솔루션을 달성하기 위해 du 옵션:

# the '%s' format string means "the file's size"
find . -name "*.txt" -printf "%s\n" \
  | awk '{sum += $1} END{print sum " bytes"}'

예, 예, 다음을 사용하는 솔루션 paste 또는 bc 또한 가능하지만 더 이상 간단하지 않습니다.

macOS에서는 Homebrew 또는 MacPorts를 사용하여 설치해야 합니다. findutils, 그리고 전화 gfind 대신에.(나 보다 이 질문에는 "linux" 태그가 있지만 "unix" 태그도 붙어 있습니다.)

GNU 없이 find, 여전히 다시 사용하여 돌아갈 수 있습니다. du:

find . -name "*.txt" -exec du -k + \
  | awk '{kbytes+=$1} END{print kbytes " Kbytes"}'

…하지만 명심해야 할 사실은 다음과 같습니다. du의 기본 출력은 다음과 같습니다. 512바이트 블록 역사적인 이유로("근거" 섹션 참조) 여기) 및 일부 버전의 du (특히 macOS의 경우) 가지다 크기를 바이트 단위로 인쇄하는 옵션.

여기에는 다른 많은 훌륭한 솔루션이 있습니다(참조 반의 대답 특히), 그러나 대부분은 불필요하게 복잡하거나 GNU 전용 기능에 너무 많이 의존한다는 단점을 겪고 있습니다. 아마도 귀하의 환경에서는 괜찮습니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top