큰 디렉토리를 압축하려고 하는데 결과 파일의 크기가 정확히 얼마나 되는지 알고 싶습니다.
나는 다음을 사용해 보았습니다 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
(서문 필요 없음 )-
tar
f
-
표준 출력. (크기만 원하고 아래에 파일이 많으면 참고하세요.목차성능상의 이유로 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
.
그러나 dd
및 tar
사용 사례에서는 실제로 스트림을 삭제할 필요가 없습니다. 위와 같이 리디렉션 /dev/null
하지만 파일로 쉽게 리디렉션할 수 있으며 파일이 작성된 당시의 크기 보고서를 계속 받을 수 있습니다.
답변4
귀하의 질문 내용이 tar ... | wc -c
위의 답변과 일치합니다. 나는 원래 tar 파일이 생성될 때 보고된 크기를 원한다는 자동 가정으로 귀하의 질문을 읽었습니다(아마도 tar의 출력이 네트워크 링크를 통해 파이프되었습니까?).
pv
이런 경우에는 Pipe Viewer를 사용하는 것이 좋습니다 . 이에 대한 언급은 본 적이 있지만 아직 사용할 기회가 없었습니다.
인용하다