Estou escrevendo um script no qual estou compactando arquivos.
Existe a possibilidade de eu poder compactar um arquivo, criar um arquivo com o mesmo nome e tentar compactá-lo também, por exemplo
$ 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
Ao usar gzip --force
, posso forçar o gzip a sobrescrever foo.gz
, mas nesse caso, acho que há uma boa chance de que eu possa perder dados se sobrescrever foo.gz
. Não parece haver uma opção de linha de comando para forçar o gzip a deixar os .gz
arquivos em paz ... uma versão não interativa de pressionar 'n' no prompt.
Eu tentei gzip --noforce
e gzip --no-force
, esperando que isso seguisse o padrão de opções do GNU, mas nenhum deles funcionou.
Existe uma solução alternativa direta para isso?
Editar:
Acontece que essa é uma das vezes que vale a pena ler a página de informações em vez da página de manual.
Na página de informações:
`--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.
Faltava o texto na página de manual e quando não estava em execução em segundo plano
Quando executado em segundo plano, o gzip não será solicitado e não será substituído, a menos que a -f
opção seja invocada.
fonte
find ./ ! -name "*gz" -exec gzip {} \; &
isso funciona:find ./ ! -name "*gz" -print0 | xargs -0 -n 1 -t gzip
relatórios gzip:gzip: ./2012-July.txt.gz already exists; not overwritten
Respostas:
Percebi que a melhor maneira de evitar o efeito indesejado é não pedir ao programa para executar o efeito indesejado. Ou seja, simplesmente não diga para compactar um arquivo se o arquivo já estiver presente na forma compactada.
por exemplo:
ou menor (execute
true
se houver um arquivo.gz, comprima o arquivo de outra forma)fonte
poke a file
.A coisa mais próxima que eu poderia encontrar de um único comando é o seguinte:
O
yes
comando imprimey
seguido de um avanço de linha para stdout até receber um sinal. Se houver um argumento, ele será impresso em vez dey
. Nesse caso, ele imprimen
até o gzip sair, fechando o tubo.É o equivalente a entrar
n
repetidamente no teclado; isso responderá automaticamente à perguntagzip: archive/foo.gz already exists; do you wish to overwrite (y or n)?
Em geral, acho que é melhor não tentar compactar os arquivos se o arquivo compactado em gzip existir; minha solução é mais ruidosa, mas atende às minhas necessidades particulares de substituição substituta do
gzip
comando, em um arquivo de configuração.fonte
gzip
saídas2