250GB의 대용량 일반 텍스트 파일을 작성하는 변경할 수 없는 애플리케이션이 있습니다. GZ로 압축하면 30GB만 남습니다.
애플리케이션에는 출력을 압축하는 옵션이 없으며 파일 이름만 쓸 수 있습니다(표준 출력 아님).
먼저 250GB 파일을 디스크에 저장하지 않고 출력의 즉시 압축을 설정하는 방법이 있습니까?
또한 애플리케이션이 실제로 압축된 일반 텍스트 파일을 읽도록 속이는 반대 접근 방식도 필요합니다.
답변1
파일 이름으로 를 사용 /dev/stdout
하고 애플리케이션의 출력을 gzip
.
/dev/stdout
에 대한 심볼릭 링크입니다 /proc/self/fd/1
.
마찬가지로 이를 파일 이름으로 사용 /dev/stdin
하고 출력을 gzip
애플리케이션에 파이프할 수 있습니다.
나는 말했다가능한, 애플리케이션은 검색 가능하지만 /dev/std{in,out}
검색할 수 없는 파일을 쓰거나 읽어야 할 수 있기 때문입니다. 이런 경우에는 길을 잃을 수도 있습니다. 검색 가능한 파일을 애플리케이션의 대상으로 사용해야 합니다.
답변2
mkfifo
를 사용하면 프로그램이 작성되고gzip
최종 목적지에 도달 할 수 있는 명명된 파이프를 설정할 수 있습니다 .이 (아마도 bash 관련) 트릭은 명령줄에서 출력 파일 이름을 프로그램에 전달할 수 있는 경우에도 작동합니다.
program >(gzip - >output.gz)
왜냐하면 이것은 쉘에 의해gzip - </dev/fd/63 >output.gz &; program /dev/fd/63
.
답변3
처음에는 이것이 간단하다고 생각했습니다. 프로그램이 쓰기를 기대하는 압축 파일 시스템에 루프백 장치를 설치하기만 하면 됩니다. 불행하게도 검색하는 동안 읽기/쓰기 파일 시스템이 많지 않고 거기에 있는 것(jffs2)이 루프백 장치를 통해 마운트될 수 없다는 것을 발견했습니다.
내가 찾았어퓨즈 압축이것이 당신이 찾고 있는 것일 수도 있지만, 높은 신뢰성이 필요하다면 건너뛰겠습니다.
또 다른 옵션은 파일을 USB 하드 드라이브에 저장하고 프로그램이 작성하는 심볼릭 링크를 만드는 것입니다. 이 프로그램을 자주 사용하거나 아직 250GB 이상의 USB 드라이브가 없는 경우에는 문제가 될 수 있습니다.
답변4
애플리케이션에서 검색 가능한 입력 및 출력을 요구하지 않는 경우 이를 전달 /dev/stdout
하거나 <(gunzip <data.gz)
— 참조캠의 대답그리고알렉스의 대답.
애플리케이션에 검색 가능한 파일이 필요한 경우 가장 좋은 옵션은 압축 파일 시스템을 구현하는 것입니다. 압축을 지원하는 몇 가지 UNIX 파일 시스템 구현이 있습니다.
- 통과하다퓨즈, 대부분의 unice에서 사용 가능, 일부압축 파일 시스템.퓨즈 압축그리고복합 퓨즈두 가지 옵션이 있고 다양한 옵션이 있습니다.아카이브 파일 시스템.
- 지브스주방 싱크대 및 압축을 포함한 모든 것을 지원합니다. 이는 오늘날 Solaris(그 기원)의 기본 파일 시스템입니다. 그것은퓨즈를 통해 사용 가능적어도 리눅스에서는요. FreeBSD와 NetBSD에는 최소한 부분적으로 zfs의 기본 구현이 있습니다.
- Linux에는 ext2 및 그 파생물에 대한 압축을 활성화하는 패치가 있습니다. 얼마나 안정적인지, ext3 및 ext4와 얼마나 호환되는지 모르겠습니다.