Есть ли способ заставить gzip не перезаписывать файлы при конфликте?

Я пишу сценарий, в котором я разархивирую файлы.

Существует возможность, что я могу заархивировать файл, создать файл с тем же именем и попытаться также сжать его, например:

$ 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, Кажется, нет переключателя командной строки, чтобы заставить gzip выйти .gz только файлы... неинтерактивная версия нажатия 'n' в приглашении.

Я старался 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 ответа

Самая близкая вещь, которую я мог найти к единственной команде, состоит в следующем:

yes n | gzip archive/foo

yes печать команд y затем перевод строки на стандартный вывод, пока не получит сигнал. Если у него есть аргумент, он напечатает это вместо y, В этом случае он печатает n пока gzip не выйдет, закрыв тем самым трубу.

Это эквивалент ввода n неоднократно на клавиатуре; это автоматически ответит на вопрос gzip: archive/foo.gz already exists; do you wish to overwrite (y or n)?

В целом, я думаю, что лучше не пытаться сжимать файлы, если существует соответствующий gzip-файл; мое решение шумнее, но оно соответствует моим конкретным потребностям в замене gzip Команда, сидящая в файле конфигурации.

До меня дошло, что лучший способ избежать нежелательного эффекта - не просить программу выполнить нежелательный эффект. То есть просто не говорите ему сжимать файл, если файл уже присутствует в сжатом виде.

например:

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

или короче (беги true если есть файл.gz, сожмите файл в противном случае)

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

Пытаться:

      gzip -d -r ./folder && gzip -r ./folder
Другие вопросы по тегам