.gz 파일 확장자 없이 gzip 파일을 만드는 방법은 무엇입니까?

.gz 파일 확장자 없이 gzip 파일을 만드는 방법은 무엇입니까?

원본 파일 이름을 유지하는 gzip 압축 파일을 만들고 싶습니다. 예를 들어 "example.txt"를 gzip으로 압축하면 "example.txt.gz" 대신 "example.txt"라는 이름의 gzip 파일이 출력되어야 합니다. 후속 명령을 실행하지 않고 하나의 명령으로 이 작업을 정상적으로 수행할 수 있습니까 mv?

답변1

이것은 작동하지 않습니다:

# echo Hello World > example.txt
# gzip < example.txt > example.txt # WRONG!
# file example.txt
example.txt: gzip compressed data, from Unix, last modified: Thu Mar 21 19:45:29 2013
# gunzip < example.txt
<empty file>

이것은 경쟁 조건입니다.

# echo Hello World > example.txt
# dd if=example.txt | gzip | dd of=example.txt # still WRONG!
# gunzip < example.txt 
Hello World # may also be empty

문제는 > example.txt다른 dd of=example.txt프로세스가 파일을 읽을 기회를 갖기 전에 파일을 죽이는 것입니다. 따라서 명확한 해결책이 없으므로 이를 고수해야 합니다 mv.

당신은 여러 가지 방법으로 속일 수 있습니다. 파일을 연 다음 링크를 해제할 수 있습니다. 파일은 닫을 때까지 계속 존재합니다. 그런 다음 동일한 이름의 새 파일을 만들고 gzip으로 압축된 데이터를 여기에 쓸 수 있습니다. 그러나 나는 bash가 그것을 사용하도록 강제하는 확실한 방법을 알지 못하며, 그렇게 하더라도 내 대답은 여전히 ​​다음과 같습니다.

이런 짓도 하지 마세요.

어떤 이유로든 실패 하거나 gzipgzip 압축 중에 공간이 부족해지는 등 문제가 발생하는 경우(다른 프로세스가 쓰고 있거나 gzip 결과가 입력보다 크므로 이는 임의의 데이터에서 발생합니다. 등) 파일을 잃게 됩니다. 축하해요!

별도의 파일을 생성하고 mv성공했습니다. 이것은 당신이 찾을 수 있는 가장 간단하고, 이해하기 쉽고, 가장 신뢰할 수 있는 방법입니다.

답변2

AWS S3에 대한 CI 배포의 일부로 동일한 문제가 발생했습니다.

이것은 접미사 없이(in-place) 디렉토리를 재귀적으로 gzip하기 위해 수행하는 작업입니다 .gz.

find . -type f -exec gzip "{}" \; -exec mv "{}.gz" "{}" \;

내가 보기에는 충분히 깨끗한 것 같다. 하지만 그래, 넌 어딘가에 있어야 할 것 같구나 mv.

사용하고 계시다면 grunt살펴보시면 됩니다 grunt-contrib-compress. S3 배포용으로 특별히 설계된 일부 grunt도구는 gzip도 처리합니다.

답변3

-S원하는 확장 프로그램

gzip -S "`_date +%Y_%M' dog.txt 

dog.txt_2015_11을 생성합니다.

압축을 풀 때 확장자를 지정해야 합니다.

gzip -d _2015_11 dog.txt_2015_11

유닉스에서는 file 명령을 사용하여 가지고 있는 파일 유형이 무엇인지 확인합니다. 확장자는 오해의 소지가 있거나 종종 누락됩니다.

답변4

당신은 시도 할 수 있습니다s3_웹사이트이를 위해.

나는 이것이 스칼라와 루비로 작성되었다는 점과 JVM이 필요하다는 점이 마음에 들지 않습니다. 또한 나는 그것이 만드는 가정(특히 버킷에서 추가 파일을 제거한다는 사실)이 마음에 들지 않지만 만족한다면 작동할 것입니다.

나는 이러한 제한 없이 나만의 도구를 작성할 계획이므로 계속 지켜봐 주시기 바랍니다.

관련 정보