하드 디스크 사용량이 90%인 컴퓨터가 있습니다. 500개가 넘는 로그 파일을 더 작은 새 파일로 압축하고 싶습니다. 그러나 하드 드라이브는 원본 파일과 압축 파일을 모두 담기에는 너무 작습니다.
그래서 필요한 것은 모든 로그 파일을 새 파일로 하나씩 압축하고 압축 후 원본 파일을 각각 삭제하는 것입니다.
Linux에서 이 작업을 어떻게 수행할 수 있나요?
답변1
나는 직접 타르 솔루션을 생각해 냈습니다.
개별 파일을 대상 파일로 압축한 후 삭제합니다.
하지만 압축 속도는 그다지 빠르지 않습니다. 명령은 다음과 같습니다.
tar -zcvf my_log.tar.gz *.log --remove-files
답변2
gzip
또는 bzip2
파일을 압축하고 압축되지 않은 파일을 자동으로 삭제합니다(이것이 기본 동작입니다).
그러나 압축 프로세스 중에 두 파일이 모두 존재한다는 점을 명심하십시오.
로그 파일(예: 텍스트가 포함된 파일)을 압축하려는 경우 bzip2
텍스트 파일에 대한 비율이 더 높으므로 이 방법을 선호할 수 있습니다.
bzip2 -9 myfile # will produce myfile.bz2
비교 및 예:
$ ls -l myfile
-rw-rw-r-- 1 apaul apaul 585999 29 april 10:09 myfile
$ bzip2 -9 myfile
$ ls -l myfile*
-rw-rw-r-- 1 apaul apaul 115780 29 april 10:09 myfile.bz2
$ bunzip2 myfile.bz2
$ gzip -9 myfile
$ ls -l myfile*
-rw-rw-r-- 1 apaul apaul 146234 29 april 10:09 myfile.gz
고쳐 쓰다@Jjoao가 댓글에서 말했듯이 흥미롭게도 xz
일반 파일과 기본 옵션 사이에는 최적의 비율이 있는 것 같습니다.
$ xz -9 myfile
$ ls -l myfile*
-rw-rw-r-- 1 apaul apaul 109384 29 april 10:09 myfile.xz
자세한 내용은 다양한 도구에 대한 흥미로운 벤치마크를 참조하세요.http://binfalse.de/2011/04/04/comparison-of-compression/
위의 예에서는 -9
가장 좋은 압축률을 사용했지만, 압축률보다 데이터를 압축하는 데 필요한 시간이 더 중요하다면 사용하지 않는 것이 좋습니다(낮은 옵션, 즉 -1
, 또는 그 사이의 옵션을 사용).
답변3
bash에서 io 리디렉션을 사용하면 >
새 데이터가 기록되기 전에 원본 파일이 비어 있게 됩니다.
쓰기 전에 파일을 비우는 대신 파일의 일부 내용을 덮어쓰는 dd 명령이 있으므로 다음이 작동할 수 있습니다.
gzip -c some-file | dd conv=notrunc of=some-file
대부분의 경우 압축된 데이터는 원본 데이터보다 작습니다. gzip이 처음 N 바이트를 읽을 때 M 바이트만 출력합니다(여기서 M < N). 따라서 원본 파일의 첫 M 바이트를 압축된 데이터로 덮어쓰고 첫 N 바이트 이후의 데이터를 유지하는 것이 안전합니다. 데이터는 변경되지 않습니다. .
하지만 gzip이 끝난 후에도 데이터가 있을 것입니다.
그러나 dd가 gzip보다 빠르게 작성하면 어떻게 될지 모르겠습니다.
또는 losstup을 통해 파일을 블록 장치에 매핑할 수 있습니다. 블록 장치의 경우 쓰기 작업으로 인해 원본 데이터가 지워지지 않습니다.
loop_device=$(losetup -f--show some-file)
gzip -c $loop_device > $loop_device
답변4
BSD 버전의 tar에서 이 작업을 수행하려고 합니다. 이 경우 --remove-files 옵션을 사용할 수 없습니다. 내가 결국 한 일(그리고 일한 일)은 다음과 같습니다.
find folder_to_tar -type f -exec tar --append --file=output_tar_file.tar {} \; -exec rm -v {} \;