파일 목록이 포함 된 파일에서 총 파일 크기 가져 오기


14

총 파일 크기를 알고 싶은 파일 목록이 포함 된 파일이 있습니다. 그렇게하는 명령이 있습니까?

내 OS는 매우 기본적인 리눅스입니다 (Qnap TS-410).

편집하다:

파일에서 몇 줄 :

/ share / archive / Bailey Test / BD006 / 0.tga
/ share / archive / Bailey / BD007 / 1 버전 1.tga
/ share / archive / Bailey 2 / BD007 / example.tga


파일의 몇 줄을 보여주세요.
EEAA

추가 된 파일의 예.
Nicolas

그건 일종의 NAS예요? busybox가 설치되어 있습니까?
cjc

예, 이미 설치되어 있다고 생각합니다. 왜 그렇습니까?
Nicolas

답변:


13

나는 busybox에서 이와 같은 것이 작동한다고 생각합니다.

du `cat filelist.txt` | awk '{i+=$1} END {print i}'

나는 당신과 같은 환경을 가지고 있지 않지만 파일 이름에 공백이 있으면 다음과 같이 작동합니다.

cat filelist.txt | while read file;do
  du "$file"
done | awk '{i+=$1} END {print i}'

편집 1 :
@stew는 아래 게시물에 있으며, du는 정확한 파일 크기가 아닌 디스크 사용량을 보여줍니다. 동작을 변경하려면 busybox는 -a 플래그를 사용하므로 du -a "$file"정확한 파일 크기를 설정하고 출력 / 동작을 비교하십시오.


1
입력 해 주셔서 감사합니다. 첫 번째 명령은 /usr/bin/du: Argument list too long내 파일에서 거의 80,000 줄을 반환합니다 . 두 번째 명령은 Enter 키를 누르면 더 많은 것을 기다리는 프롬프트를 표시합니까?
Nicolas

당신의 환경과 말하기 어렵다. 정상적인 명령 프롬프트입니까 아니면 깜박이는 프롬프트입니까? 후자의 경우 결과를 기다리는 것이 느릴 수 있습니다. "입력 프롬프트"인 경우 일부 문자를 놓친 것일 수 있습니까? 그리고 그 정상적인 프롬프트를 모르는 경우 입력하기 전에 완전히 테스트했습니다. :(
Mattias Ahnberg

내가 다음을 수행 할 때 "입력 프롬프트" cat tgafiles.txt | while read file;do du "$file" done | awk '{i+=$1} END {print i}'입니다. 고마워 mattias
니콜라스

1
아! 한 줄에 모든 것을 넣으면 다른 줄이 필요합니다. 이와 같이 : cat tgafiles.txt | while read file;do du "$file";done | awk '{i+=$1} END {print i}'(즉, 완료하기 전에).
Mattias Ahnberg

에 딱 맞다! 완벽하게 응원했습니다! (나는이 실수를 스스로 알아낼 수 있었지만)
Nicolas

8
du -c `cat filelist.txt` | tail -1 | cut -f 1

-c"총 크기"행을 추가합니다.
tail -1마지막 줄 (총 크기)을 사용합니다.
cut -f 1단어 "전체"를 잘라냅니다.


du-argument 목록이 너무 길면 실패합니다. 내 파일 목록이 큽니다. xargs가있는 아래 답변이 가장 쉬운 해결책 인 것 같습니다.
Syclone0044

4

리눅스 도구가 이것을 사용할 수 있는지는 모르겠지만,

cat /tmp/filelist.txt  |xargs -d \\n du -c

xargs는 구분 기호를 줄 바꿈 문자로 설정하고 du는 총계를 생성합니다.

보면 http://busybox.net/downloads/BusyBox.html 는 "비지 박스 뒤"총계 옵션을 지원하는 것으로 보인다,하지만 "비지 박스의 xargs를"하지 않습니다 지원 사용자 정의 구분 기호.

다시 말하지만, 나는 당신의 툴셋을 확신하지 못합니다.


결과는 다음과 같습니다.xargs: invalid option -- d
Nicolas

굉장 : NAS의 busybox 리눅스로 작업하는 것은 McGuyver 에피소드와 같으며 일부 캔버스, 스틱 및 꼬기에서 작동하는 비행기를 만들려고합니다.
cjc

다른 컴퓨터에 여유 공간이 있다면 관심있는 모든 파일을 다른 모든 기능을 갖춘 Linux에 복사 한 다음 Stew의 솔루션을 실행하십시오. busybox가 이런 종류의 일을 할 수 있는지 알아내는 것보다 훨씬 쉽습니다.
cjc

1
대답이 최고라고 생각합니다. 간결 하고이 스레드의 다른 답변보다 훨씬 빠릅니다.
zymhan

좋은 대답입니다. 파일 목록이 충분히 길면 -cxargs에서 여러 번의 호출을 수행 du하여 여러 개의 du합계를 생성 하므로 생략 할 수 있습니다 .
qwr

4
while read filename ;  do stat -c '%s' $filename ; done < filelist.txt | awk '{total+=$1} END {print total}'

이것은 Mattias Ahnberg의 솔루션과 유사합니다. "읽기"를 사용하면 공백이있는 파일 이름 / 디렉토리 관련 문제가 발생합니다. 파일 크기를 얻는 stat대신 사용 합니다 du. du는 파일 크기 대신 디스크에서 사용중인 공간을 확보하고 있습니다. 파일 시스템에 따라 1 바이트 파일은 여전히 ​​디스크에서 4k를 차지합니다 (또는 블록 크기에 관계없이). 따라서 1 바이트 파일의 경우 stat는 1 바이트이고 du는 4k입니다.


파일 크기 대 디스크 크기에 대한 좋은 의견!
Mattias Ahnberg

실제로 매우 흥미로운 의견, 불행히도 내 리눅스는 다음 stat명령을 모른다 :stat: command not found
Nicolas

"busybox stat"라고 말해야 할 수도 있습니다.
cjc

그것은 말합니다 stat: applet not found이 경우
니콜라스

4

이 문제에 대한 또 다른 해결책은 다음과 같습니다.

cat filelist.txt | tr '\n' '\0' | wc -c --files0-from=-

나를 위해 (cygwin에서) du -bc훨씬 빠르게 실행됩니다.
qwr

2

다음과 같이 해보십시오 :

$ cat filelist.txt | xargs ls -l | awk '{x+=$5} END {print "total bytes: " x}' 

경로의 공백을 올바르게 처리하려면 다음을 수행하십시오.

$ find /path/to/files -type f -print0 | xargs -0 ls -l | awk '{x+=$5} END {print "total bytes: " x}' 

입력 해 주셔서 감사합니다. 불행히도 내 파일 내의 디렉토리 공간에 "\"로 이스케이프되지 않는 문제가 있다고 생각합니다. 따라서 파일 목록을 통과하는 동안 중단됩니다.
Nicolas

텍스트 파일 목록을 무시하고 출력에서 find?
EEAA

불행히도 목록이 너무 길면 79159 줄의 파일 (전체 경로)이 있으므로 파일로 출력합니다. 어쩌면 내가 찾은 결과를 탈출하는 것에 대한 논쟁을 추가 할 수 있습니까?
Nicolas

내 리눅스 시스템에서 찾은 "-print0"인수는 없다
Nicolas

@Nicolas- find실제 find바이너리 대신 busybox의 스트립 다운을 사용하기 때문 입니다.
EEAA

1

cat docs.txt | xargs -d \\n du -sk | awk '{total+=$1} END{print total}'

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.