표준 입력의 크기를 얻는 방법은 무엇입니까?

표준 입력의 크기를 얻는 방법은 무엇입니까?

큰 디렉토리를 압축하려고 하는데 결과 파일의 크기가 정확히 얼마나 되는지 알고 싶습니다.

나는 다음을 사용해 보았습니다 du.

$ tar -cv dir | du -h -
du: cannot access '-': No such file or directory

그런 다음 "-"를 사용하여 파일 버전을 사용해 보았습니다.

$ tar -cv dir | du -h /dev/stdin
1.0K

이 숫자는 정확하지 않다고 확신합니다. 표준 입력의 크기를 얻는 방법은 무엇입니까?

답변1

너무 길어요.:tar -cv dir | wc -c - | cut -d' ' -f 1 | awk '{print $1/1000"K"}'

du파일 자체의 크기는 실제로 계산되지 않습니다. 이미 파일 크기를 추적하고 있는 파일 시스템에 쿼리하도록 커널에 요청합니다. 그렇기 때문에 너무 빠릅니다. 따라서 파일 대신 스트림을 계산한다는 사실이 du작동하지 않습니다. 내 생각에는 이것이 1.0K커널에 하드코딩된 크기 인 것 같습니다 ./dev/std*

해결책은 wc -c커널을 쿼리하는 대신 바이트 자체를 계산하는 를 사용하는 것입니다.

$ tar -cv dir | wc -c

다음과 유사한 출력을 원하는 경우 du -h:

$ tar -cv dir | wc -c | awk '{print $1/1000"K"}'

awk숫자를 사람이 읽을 수 있는 결과로 변환합니다 .

답변2

나는 다음을 추천한다:

tar cf - dir | wc -c

아카이브 생성 , 출력 파일 지정 및 해당 파일임을 나타내는 간단한 c(서문 필요 없음 )-tarf-표준 출력. (크기만 원하고 아래에 파일이 많으면 참고하세요.목차성능상의 이유로 tar'를 생략하는 것이 좋습니다. )v

답변3

GNU를 사용하면 tar다음과 같은 작업을 수행할 수 있습니다.

tar --totals -c . >/dev/null

...다음과 같이 출력이 렌더링됩니다...

Total bytes written: 5990400 (5.8MiB, 5.5GiB/s)

...표준 오류가 발생했습니다. 마찬가지로 모든 tar의 경우(또는 스트림)이를 사용하여 dd바이트 수 보고서를 제공할 수 있습니다. 이보다 나을 수도 있고 아닐 수도 있지만 wc기본 dd블록 크기는 512바이트입니다. 이는 tar의 블록 크기와 같습니다. 귀하의 시스템이파이프 버퍼충분히 크면 레코드 크기(즉, 20블록 또는 10240바이트)에 dd맞게 블록 크기를 확장할 수도 있습니다. tar이와 같이:

tar -c . | dd bs=bx20 >/dev/null
585+0 records in
585+0 records out
5990400 bytes (6.0 MB) copied, 0.0085661 s, 699 MB/s

이보다 더 나은 것을 제공할 수도 있고 그렇지 않을 수도 있습니다 wc.

그러나 ddtar사용 사례에서는 실제로 스트림을 삭제할 필요가 없습니다. 위와 같이 리디렉션 /dev/null하지만 파일로 쉽게 리디렉션할 수 있으며 파일이 작성된 당시의 크기 보고서를 계속 받을 수 있습니다.

답변4

귀하의 질문 내용이 tar ... | wc -c위의 답변과 일치합니다. 나는 원래 tar 파일이 생성될 때 보고된 크기를 원한다는 자동 가정으로 귀하의 질문을 읽었습니다(아마도 tar의 출력이 네트워크 링크를 통해 파이프되었습니까?).

pv이런 경우에는 Pipe Viewer를 사용하는 것이 좋습니다 . 이에 대한 언급은 본 적이 있지만 아직 사용할 기회가 없었습니다.

인용하다

관련 정보