파일 이름 목록(한 줄에 하나의 파일 이름)이 포함된 텍스트 파일이 있습니다.
이제 이 모든 파일의 크기를 계산하고 싶습니다. ls -la
파일의 각 줄에 대해 작업을 수행한 다음 파일 크기를 누적해야 한다고 생각합니다 .
awk
나는 이것이 해결책의 일부가 될 것이라고 생각 하지만 그것은 단지 추측일 뿐입니다.
답변1
du -c
출력 의 마지막 줄만 필요합니다.
du -ch $(<list) | tail -1
답변2
GNU 사용 stat
:
stat -c %s -- $(<list) | paste -d+ -s - | bc
stat
파일에 대한 정보 표시-c
%s
파일 크기를 바이트 단위로 제공하여 형식을 지정합니다.
paste -d+ -s
+
구분 기호로 사용하여 출력을 한 줄씩 연결합니다.bc
에 파이프하면bc
함께 계산됩니다.
심볼릭 링크의 경우 심볼릭 링크가 최종적으로 확인되는 파일의 크기를 계산하려는 경우 -L
옵션 을 추가하세요 .stat
ksh
, bash
or 와 같은 쉘이 있고 연산자를 zsh
사용하여 $(<file)
파일 내용에 대해 분할+glob을 호출한다고 가정합니다.
이는 list
공백, 탭 또는 개행(기본값 가정 $IFS
)으로 구분된 파일 모드 목록( 에서와 같이 *.txt /bin/*
)이어야 합니다. 파일 경로 목록(한 줄에 하나씩)을 보려면 와일드카드를 비활성화하고 $IFS
줄 바꿈만 제한하거나 GNU를 사용해야 합니다 xargs
.
xargs -rd '\n' -a list stat -c %s -- | paste -sd+ - | bc
답변3
나는 사용할 것이다-s
파일 테스트 및 perl
:
-s 파일의 크기가 0이 아닙니다(크기를 바이트 단위로 반환).
이 같은:
#!/usr/bin/env perl;
use strict;
use warnings;
my $sum = 0;
while ( my $filename = <> ) {
chomp ( $filename );
$sum += -s $filename;
}
print "Sum is $sum bytes\n";
STDIN
(명령줄에 지정된 파일에서 파일 이름을 읽습니다. 예: myscript.pl file_list.txt
)
"한 줄로" 이 작업을 수행할 수 있습니다.
perl -nle '$sum += -s $_; END { print $sum }'
(그리고 이전과 같이 "파일 이름 목록"에 파이프를 입력하거나 그 뒤에 파일 매개변수를 지정할 수 있습니다)
답변4
나는 또한 해결책을 생각해 냈습니다.
cat files.txt | while read f; do ls -la $f; done | awk '{s+=$5;} END {print s;}'