충돌시 gzip이 파일을 덮어 쓰지 않도록하는 방법이 있습니까?


17

파일을 압축하는 스크립트를 작성 중입니다.

파일을 압축하고 동일한 이름의 파일을 생성하고 이것을 압축하려고 시도 할 수도 있습니다. 예 :

$ ls -l archive/
total 4
-rw-r--r-- 1 xyzzy xyzzy  0 Apr 16 11:29 foo
-rw-r--r-- 1 xyzzy xyzzy 24 Apr 16 11:29 foo.gz

$ gzip archive/foo
gzip: archive/foo.gz already exists; do you wish to overwrite (y or n)? n   
    not overwritten

를 사용 gzip --force하면 gzip을 덮어 쓸 수 foo.gz있지만이 경우 덮어 쓰면 데이터가 손실 될 가능성이 높다고 생각합니다 foo.gz. .gz프롬프트에서 'n'을 누르는 비 대화식 버전 인 gzip이 파일 을 그대로 두도록 명령 행 스위치가없는 것 같습니다 .

나는 시도 gzip --noforce하고 gzip --no-force있지만, 어느 일이 중, 이것들은 GNU 옵션 표준에 따라 수 있다는 희망.

이에 대한 직접적인 해결 방법이 있습니까?

편집하다:

이것은 맨 페이지가 아닌 정보 페이지를 읽는 데 지불하는 시간 중 하나입니다.

정보 페이지에서 :

`--force'
`-f'
     Force compression or decompression even if the file has multiple
     links or the corresponding file already exists, or if the
     compressed data is read from or written to a terminal.  If the
     input data is not in a format recognized by `gzip', and if the
     option `--stdout' is also given, copy the input data without
     change to the standard output: let `zcat' behave as `cat'.  If
     `-f' is not given, and when not running in the background, `gzip'
     prompts to verify whether an existing file should be overwritten.

맨 페이지에 텍스트 가없고 백그라운드에서 실행되지 않을 때

백그라운드에서 실행될 때 gzip은 프롬프트를 표시하지 않으며 -f옵션이 호출 되지 않으면 덮어 쓰지 않습니다 .


3
gzip이 백그라운드인지 확인하는 방법을 모르겠지만 작업중 인 시스템의 bash에 '&'를 추가해도 효과가 없습니다. 파이프의 반대편에있는 것이 작동하는 것처럼 보이지만 대신 다음과 find ./ ! -name "*gz" -exec gzip {} \; & 같이 작동합니다. find ./ ! -name "*gz" -print0 | xargs -0 -n 1 -t gzip gzip 보고서 : gzip: ./2012-July.txt.gz already exists; not overwritten
Bill McGonigle

1
@BillMcGonigle 귀하의 의견은 답변입니다!
Rockallite

답변:


9

그것은 바람직하지 않은 영향을 피할 수있는 가장 좋은 방법은하는 것입니다 떠올랐다있다 되지 바람직하지 않은 효과를 수행 할 수있는 프로그램을 부탁드립니다. 즉, 파일이 이미 압축 된 형식으로 존재하는 경우 파일을 압축하도록 지시하지 마십시오.

예 :

if [ ! -f "$file.gz" ]; then 
    gzip "$file"; 
else 
    echo "skipping $file"
fi

또는 더 짧음 ( truefile.gz가있는 경우 실행 , 그렇지 않으면 파일 압축)

[ -f "$file.gz" ] && echo "skipping $file" || gzip "$file"    

불행히도 이것은 펄 스크립트 내에서 시스템 명령으로 실행되고 있습니다 (IO :: Compress :: Gzip과 같은 것을 사용하지 않는 이유에 대한 긴 이야기). 압축 명령 자체는 구성 파일에 저장됩니다. 후자의 명령은 내가 필요한 것에 가깝게 보이지만 내 요구에 조금 더 잘 맞는 것을 발견했다고 생각합니다. 나는 당신의 대답을 받아 들일 것입니다. 왜냐하면 그것이 나의 것보다 더 일반적인 해결책이기 때문입니다. 그러나 실제로 사용할 것에 대해서는 아래를보십시오.
Barton Chittenden

펄에서 파일을 찌를 수있다 ...
Ярослав Рахматуллин

1
의 의미가 명확하지 않습니다 poke a file.
Barton Chittenden

미국 영어로 일상적인 의사 소통에 연관성 / 이미지 사용이 부족할 때마다 놀랍니다. :) 시도하고 설명하겠습니다. 죽은 까마귀를 막대기로 찌르는 아이의 이미지를 생쥐가 살아 있는지 여부를 확인하십시오. Poking 은 여기서 속성조사하는 데 사용됩니다 . 마찬가지로 파일을 파킹하면 파일 이 있는지와 같이 파일 을 확인 해야 합니다. 어쨌든, 내가 느끼는 파고의 행위를해야에서 최소한 평균 "외부 물체와의 접촉을 달성" 그리고 말에 충분하다 "파일에 대한 몇 가지 정보를 얻을" 대신 맞춤법의, 이미지와 함께합니다.
Ярослав Рахматуллин

"poke"는 종종 메모리 위치를 설정하기위한 해커 속어입니다. 참조 : en.wikipedia.org/wiki/PEEK_and_POKE#Generic_usage_of_.22POKE.22
Bill McGonigle

12

단일 명령에 가장 가까운 것은 다음과 같습니다.

yes n | gzip archive/foo

yes명령 y은 신호를 수신 할 때까지 stdout에 대한 줄 바꿈을 인쇄합니다 . 인수가 있으면 대신 대신 인쇄합니다 y. 이 경우 ngzip이 종료 될 때까지 인쇄 하여 파이프를 닫습니다.

이것은 n키보드에서 반복적으로 입력하는 것과 같습니다 . 이것은 자동으로 질문에 대답합니다gzip: archive/foo.gz already exists; do you wish to overwrite (y or n)?

필자는 일반적으로 해당 gzip 파일이 존재하는 경우 파일을 압축하지 않는 것이 좋습니다. 내 솔루션은 소음이 적지 만 gzip구성 파일에 앉아 명령 을 대체 할 필요가 있습니다.


1
이것에 대한 또 다른 성가심은 gzip출구입니다2
Steven Penny
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.