15

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

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

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

2 ответа2

10

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

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 в файле конфигурации.

8

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

например:

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .