사용 된 디스크 공간의 양을 계산하십시오


25

리눅스에는 프로그램이 얼마나 많은 데이터를 생산할 수 있는지 계산할 수있는 프로그램이 있습니까?

예를 들어, MySQL 데이터베이스를 백업하고 싶다면 보통

mysqldump > dumpfile.sql

대신에 리디렉션하고 /dev/null싶지만 사용 된 디스크 공간의 양을 계산하고 싶습니다.

mysqldump | fancy_space_calc_program

산출:

123456789 Bytes would have been used

MySQL 백업은 단지 예일뿐입니다. 사전에 크기를 예측할 수있는 방법을 잘 알고 있으므로 이에 대한 의견은 없습니다.


1
나는 당신이 정말로 하나를 만들 수 있다고 생각하지도 않습니다. 어떤 경우에는 어떤 앱이 어떤 서버를 호출하고 그 서버에서 데이터를 다운로드하는지 추정 할 수있는 방법 때문에 외국 앱에서는 그러한 것들을 추정 할 수 없기 때문에 특정한 경우에는 그렇습니다. 따라서 이것은 응용 프로그램마다-MYSQL에 대해 이미 알고 있다고 설명 할 때-거기에 대한 설명은 없지만 다른 응용 프로그램은 응용 프로그램마다 올바르게 예측할 수있는 일반적인 도구는 없습니다.
Drako

1
견적을 내리려면 실제로 프로그램을 실행하고 안전한 곳으로 보내지는 동안 출력을 관찰해야한다는 것을 알고 싶습니다. 프로그램이 다른 것에 돌이킬 수없는 영향을 미치면 의도하지 않은 부작용없이 한 번만 실행할 수 있으면 불가능합니다. 다른 문제는 프로그램이 변경 입력에서 출력을 파생하면 다음 실행이 다른 (다른 크기) 출력 파일을 생성한다는 것입니다. 마지막 : 디스크 공간 <> (바이트). 그리고 다양한 파일 시스템은 부기에 대한 오버 헤드가 다릅니다.
Tonny

1
네, 잘 알고 있습니다. 여전히 나에게 충분합니다.
fancyPants 2016 년

@Drako 프로그램의 텍스트 출력을 측정하는 일반적인 방법을 사용할 수 있습니다. 앱마다있을 필요는 없습니다 (예 : 허용 된 답변 참조). 후속 실행에서 텍스트 출력이 안정적으로 동일한 지 여부는 앱마다 다르지만 일반적인 방식으로 출력을 측정 할 수는 없습니다. 아마도 OP와 출력을 측정하려는 다른 사람은 데이터가 주어진 응용 프로그램에 의미가있는 경우에만 그렇게 할 것입니다.
존 벤틀리

@ JonBentley 나는 당신이 그것을 가질 수 없다고 말하지 않았고, 더 자세히 읽었습니다 : "일반적인 예측은 정확하거나 가깝지 않을 것입니다 :)"그리고 이제 실행 후 내 앱이 플러그인 자체의 업데이트를 확인할 것이라고 상상해보십시오 등 i-net에서 x 량의 데이터를 다운로드하여 hdd에 저장합니다. 내 앱에 대해 아무것도 모르는 일반 도구를 사용하여 사전에 정확하게 측정하는 방법, 실행 후 얼마나 많은 스토리지가 필요합니까? 여전히 당신은 받아 들여진 대답으로 최선의 추측을 할 수 있으며 대부분의 경우 꽤 정확합니다.
Drako

답변:


37

https://stackoverflow.com/questions/13418688/use-pipe-with-du-to-compute-size-of-stdin 에서 가져온

wc -c파이프 라인을 통과하는 바이트 수를 계산 하기 위해 파이프 할 수 있습니다 .

물론 이것은 원시 바이트 일 뿐이며 섹터 크기 등과는 관련이 없으므로 소금 한 알로 가져 가십시오.


내가 일반적인 예측을 썼 듯이 정확하지 않거나 가깝지는 않을 것입니다 :)
Drako

6
@cat의 좋은 구현은 wc더 이상 실용적이지 않은 더 이상 필요없는 데이터를 버립니다.
Ruslan

2
@cat 줄이나 문자를 계산하기 위해 버퍼링이 필요하지 않기 때문에 버퍼링 될 가능성이 없다고 생각합니다. wc내 컴퓨터의 GNU coreutils 는 8GB 메모리로 40GB stdin 데이터를 쉽게 처리합니다.
Frxstrem

8
@ 마그누스. 나는 당신이 단어 놀이를 놓친 것 같아요. WC는 미국인들이 화장실이라고 부르는 영국 용어입니다. 사용하지 않은 데이터를 WC에 파이프합니다.
기금 모니카의 소송

3
@Frxstrem 더 이상 동형 인코딩 작업을하지 않는 한 줄이나 문자를 세려면 버퍼링 필요합니다. POSIX.2부터는 wc -c문자를 계산하지 않습니다-바이트를 계산합니다. wc -m문자를 계산합니다. 가장 분명한 차이점은 UTF-16 또는 Windows와 같은 멀티 바이트 문자 \r\n(ASCII에서는 2 바이트이지만 한 문자)입니다. 대부분의 경우 버퍼링이 많이 필요하지는 않지만 유니 코드는 단일 문자를 나타내는 임의의 바이트 수를 가질 수 있습니다. 신뢰할 수있는 데이터에서 볼 수있는 것이 아니라 가능한 버퍼 오버플로 벡터입니다.
루안

28

pv 명령은 이것에 완벽합니다.

mysqldump | pv -b > /dev/null

위의 내용은 원하는 올바른 명령을 제공한다고 생각합니다. pv -b | > /dev/null지금 테스트 할 수없는 것과 같은 조정이 필요할 수 있습니다.

-b 바이트 단위의 값을 제공합니다.


1
거룩한, 나는 화장실뿐만 아니라 pv도 잊었다. 부끄러운 줄 알아 두 가지 답변을 모두 받고 싶습니다. 죄송하지만 Magnus는 조금 더 빨랐으며 명성을 사용할 수 있습니다.
fancyPants

그래, 걱정하지 마라. 화장실 속임수는 정말 멋지다. 왜 그것이 나에게 즉시 발생하지 않았는지 확실하지 않다. 나는 먼저 '바'를 갔다! 그런 다음 내가 의미하는 바는 pv였습니다! :)
djsmiley2k-CoW

그리고 지금 당신은 파일 핸들을 잡고 어딘가에 / proc에서 크기를 확인하는 것에 대해 궁금해합니다 ....
djsmiley2k-CoW

2
나는 들어 본 적이 없다 pv.. 당신은 매일 새로운 것을 배우고 있습니다 :)
Magnus

2
@Magnus : wc는 문서가 많지 않은 오래된 (일부 오래된 Unix 시스템의 일부), pv가 더 적은 배포판에 사전 설치되어 있다고 생각합니다. 그래도 알아서 반갑습니다. "pv"( "파이프 뷰어") 프로그램의 홈 페이지 에서 나오는 이 개념적으로 아름다운 그림 을 보십시오
TOOGAM

0

dd이처럼 사용할 수 있습니다 cat /dev/zero | dd status=progress of=/dev/null bs=4M.

이를 통해 다음과 같이 실행되는 동안 및 전달 된 데이터 양에 대한 일부 데이터를 제공합니다.

$ cat /dev/zero | dd status=progress of=/dev/null                                                                                                                              
5371334656 bytes (5.4 GB, 5.0 GiB) copied, 4 s, 1.3 GB/s^C # this is progress data
12271136+0 records in #summary
12271135+0 records out #summary
6282821120 bytes (6.3 GB, 5.9 GiB) copied, 4.66683 s, 1.3 GB/s #summary
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.