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


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.