원래 파일 이름을 유지하는 zip 파일을 만들고 싶습니다. 예를 들어 gzipping "example.txt"는 "example.txt.gz"대신 "example.txt"라는 gzipped 파일을 출력해야합니다. 하나의 명령으로 우아하게 수행 할 수 mv
있습니까?
원래 파일 이름을 유지하는 zip 파일을 만들고 싶습니다. 예를 들어 gzipping "example.txt"는 "example.txt.gz"대신 "example.txt"라는 gzipped 파일을 출력해야합니다. 하나의 명령으로 우아하게 수행 할 수 mv
있습니까?
답변:
작동하지 않습니다.
# 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
성공하십시오. 이것이 가장 단순하고 이해하기 쉽고 신뢰할 수있는 방법입니다.
gzip example.txt && mv example.txt.gz example.txt
mv
성공하면." 더 우아하게 만들 수 있습니까? 방금 프로스트 슈츠의 답변이 특정 예를 들어 보완되도록 제안하려고했습니다. mv
내가 생각했던 것보다 더 우아하게 사용할 수 있다면 , 예를 들어주십시오.
AWS S3에 CI를 배포하는 과정에서 동일한 문제가 발생했습니다.
이것이 .gz
접미사 없이 디렉토리를 재귀 적으로 gzipping하기 위해 내가 한 일입니다 .
find . -type f -exec gzip "{}" \; -exec mv "{}.gz" "{}" \;
나를 위해 충분히 깨끗한 것 같습니다. 하지만 네 mv
어딘가에 필요한 것 같습니다 .
당신이 사용하는 경우를 grunt
볼 수 grunt-contrib-compress
있습니다. grunt
S3에 배포하기위한 도구 중 일부는 gzip도 처리합니다.
find . -type ...
하지 find.
:) 공간을하시기 바랍니다 추가
-S
당신이 원하는 확장
gzip -S "`_date +%Y_%M' dog.txt
dog.txt_2015_11이됩니다
압축을 풀 때 확장자를 지정해야합니다.
gzip -d _2015_11 dog.txt_2015_11
유닉스에서는 파일 명령을 사용하여 어떤 유형의 파일이 있는지, 확장명이 잘못되었거나 자주 누락되는 파일을 결정하십시오.
확장명이없는 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을 나열했는지 확인하는 것처럼 파일이 존재하는지 확인해야 함).
이것을 위해 s3_website 를 시도 할 수 있습니다 .
스칼라와 루비로 작성되었으며 JVM이 필요하다는 사실이 마음에 들지 않습니다. 또한 나는 그것이 가정한다는 것을 좋아하지 않지만 (특히 버킷에서 여분의 파일을 삭제한다는 사실) 마음에 들지 않으면 잘 작동합니다.
이러한 제한이없는 도구를 저 스스로 작성하려고합니다. 계속 지켜봐주십시오.
이 파일을 다른 시스템이나 사람들에게 전송할 때 혼란스럽고 압축 파일로 찾지 못할 수 있기 때문에 실제로 수행해야 할 작업이 아닙니다.
접미사를 사용하지 않으려면 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가 말했듯이, 이것을하는 것은 좋은 생각이 아닙니다.