Я пишу сценарий, в котором я разархивирую файлы.
Существует возможность, что я могу заархивировать файл, создать файл с тем же именем и попытаться также сжать его, например:
$ 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
будет вызвана опция.
источник
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
Ответы:
До меня дошло, что лучший способ избежать нежелательного эффекта - не просить программу выполнить нежелательный эффект. То есть просто не говорите ему сжимать файл, если файл уже присутствует в сжатом виде.
например:
или короче (запустите,
true
если есть файл .gz, сожмите файл в противном случае)источник
poke a file
.Самая близкая вещь, которую я мог найти к единственной команде, состоит в следующем:
Команда
yes
печатает,y
а затем перевод строки на стандартный вывод, пока не получит сигнал. Если у него есть аргумент, он напечатает его вместоy
. В этом случае он печатаетn
до выхода gzip, тем самым закрывая трубу.Это эквивалентно
n
многократному вводу с клавиатуры; это автоматически ответит на вопросgzip: archive/foo.gz already exists; do you wish to overwrite (y or n)?
В целом, я думаю, что лучше не пытаться сжимать файлы, если существует соответствующий gzip-файл; Мое решение более шумное, но оно соответствует моим конкретным потребностям для замены
gzip
команды, находящейся в файле конфигурации.источник
gzip
выходит2