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


14

원래 파일 이름을 유지하는 zip 파일을 만들고 싶습니다. 예를 들어 gzipping "example.txt"는 "example.txt.gz"대신 "example.txt"라는 gzipped 파일을 출력해야합니다. 하나의 명령으로 우아하게 수행 할 수 mv있습니까?


4
조금 궁금합니다. 왜 이것을 원하십니까? 나쁜 생각처럼 들립니다.
Bernhard

3
네. bash 스크립트에 두 줄 전체를 넣고 "my-elegant-command"라고 부릅니다. ;)
goldilocks

2
@Bernhard 웹 앱을위한 지속적인 통합 빌드 프로세스의 일부입니다. 파일 이름을 변경하지 않고 정적 자산 (CSS, JS 파일)을 압축해야합니다. 브라우저에 전달할 때 "content-encoding : gzip"헤더가 포함되어 있으므로 확장자는 관련이 없습니다. 그러나 파일 이름이 변경되면 소스 HTML 파일에서 검색 및 교체를 수행해야합니다.
jamieb

이것이 실제로 당신에게 큰 문제라면, $ *를 gzip 실행 파일에 전달하고 두 번째 줄은 mv를 수행하는 bash 함수를 정의 할 수 있습니다.
Bratchley

4
@ 귀하의 웹 응용 프로그램 문제 : 어떤 괜찮은 웹 서버가 당신을 위해 압축을 수행 할 수 있습니다 ...
Bananguin

답변:


12

작동하지 않습니다.

# 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.

속이는 방법에는 여러 가지가 있습니다. 파일을 연 다음 연결을 해제 할 수 있습니다. 파일을 닫을 때까지 파일이 계속 존재합니다. 그런 다음 동일한 이름으로 새 파일을 작성하고 gzipped 데이터를 그 파일에 씁니다. 그러나 나는 그것을 사용하기 위해 bash를 강요하는 명백한 방법을 모른다.

하지마

경우 gzip어떤 이유로 실패하거나 문제가 Gzip으로 압축하는 동안 공간이 부족처럼, 발생 (다른 프로세스가 쓰기 때문에, 또는 GZIP 결과가 입력보다 더 큰 - 임의의 데이터에 대해 발생하는 - 등), 당신은 당신의 파일을 손실 . 축하합니다!

별도의 파일을 작성하고 mv성공하십시오. 이것이 가장 단순하고 이해하기 쉽고 신뢰할 수있는 방법입니다.


1
완전성을 위해 추가하는 것은 gzip example.txt && mv example.txt.gz example.txt
어떻습니까

2
어떤 depquid도 OP를 읽지 않는다 – 그것은 우아하지 않다 .
goldilocks

@goldilocks "별도의 파일을 작성하고 mv성공하면." 더 우아하게 만들 수 있습니까? 방금 프로스트 슈츠의 답변이 특정 예를 들어 보완되도록 제안하려고했습니다. mv내가 생각했던 것보다 더 우아하게 사용할 수 있다면 , 예를 들어주십시오.
depquid

당신의 제안은 간단하고 우아하고 명백한 접근법이지만, 그것이 작동하는지 여부는 너무 많은 변수에 달려 있습니다. 예를 들어 이미 example.txt.gz가 있다면 어떻게합니까? 또한 확장명을 사용하지 않아도 이미 압축 된 파일을 gzipping하는 것을 막아야합니다. 그것은 완전히 새로운 웜 캔이지만, 실제로 질문의 일부는 아닙니다.
frostschutz

10

AWS S3에 CI를 배포하는 과정에서 동일한 문제가 발생했습니다.

이것이 .gz접미사 없이 디렉토리를 재귀 적으로 gzipping하기 위해 내가 한 일입니다 .

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

나를 위해 충분히 깨끗한 것 같습니다. 하지만 네 mv어딘가에 필요한 것 같습니다 .

당신이 사용하는 경우를 grunt볼 수 grunt-contrib-compress있습니다. gruntS3에 배포하기위한 도구 중 일부는 gzip도 처리합니다.


1
해야 find . -type ...하지 find.:) 공간을하시기 바랍니다 추가
Humdinger

2

-S 당신이 원하는 확장

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

dog.txt_2015_11이됩니다

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

gzip -d _2015_11 dog.txt_2015_11

유닉스에서는 파일 명령을 사용하여 어떤 유형의 파일이 있는지, 확장명이 잘못되었거나 자주 누락되는 파일을 결정하십시오.


1

확장명이없는 gzip 파일을 만드는 것이 실제로 올바른 일이라고 생각하지 않습니다.

IMHo .gz 파일을 읽도록 웹 서버를 구성해야합니다. 이미 다음과 같은 규칙이있을 것입니다.

Path asets/:
  If header Accept-Encoding contains "gzip" and not contains "gzip;q=0":
    Add header Content-Encoding: gzip

요청한 파일 이름을 다시 작성하여 ".gz"를 추가하는 규칙을 추가하면됩니다 (실제로 클라이언트가 Accept-Encoding 헤더에 gzip을 나열했는지 확인하는 것처럼 파일이 존재하는지 확인해야 함).


1

이것을 위해 s3_website 를 시도 할 수 있습니다 .

스칼라와 루비로 작성되었으며 JVM이 필요하다는 사실이 마음에 들지 않습니다. 또한 나는 그것이 가정한다는 것을 좋아하지 않지만 (특히 버킷에서 여분의 파일을 삭제한다는 사실) 마음에 들지 않으면 잘 작동합니다.

이러한 제한이없는 도구를 저 스스로 작성하려고합니다. 계속 지켜봐주십시오.


0

이 파일을 다른 시스템이나 사람들에게 전송할 때 혼란스럽고 압축 파일로 찾지 못할 수 있기 때문에 실제로 수행해야 할 작업이 아닙니다.

접미사를 사용하지 않으려면 GNU가 gzip -S ""a를 반환하는 것처럼 좋지 않습니다 gzip: invalid suffix ''.

그러나 항상 gzip -S " "(공백) 과 같은 것을 보낼 수 있으며 다음과 같이 표시됩니다.

$ file testfile\  
testfile: gzip compressed data, was "testfile", from Unix, last modified: Tue Jun  3 XX:XX:XX 2014

나중에 압축을 풀려면 gunzip -c testfile\ (접미사를 지정하지 않고) 또는 -f플래그를 사용 하여 작업을 수행해야합니다 .

필자는 mv명령 을 추가 &&해도 코드에 많은 번거 로움을 줄 수 없다고 생각합니다 . 어쨌든, @frostschutz가 말했듯이, 이것을하는 것은 좋은 생각이 아닙니다.


이는 정적 웹 사이트 호스팅과 같이 압축 파일을 제공하기 위해 S3를 사용하려는 경우에 필요한 것입니다. 이것을 고려할 수도 있습니다 : github.com/laurilehmijoki/s3_website
Cristian Măgherușan-Stanciu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.