Existe uma maneira de forçar o gzip a não sobrescrever arquivos em conflito?

13

Estou escrevendo um script no qual estou compactando arquivos.

Existe a possibilidade de eu compactar um arquivo, criar um arquivo com o mesmo nome e tentar gzip 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

Usando gzip --force , posso forçar o gzip a sobrescrever foo.gz , mas, neste caso, acho que há uma boa chance de perder dados se eu sobrescrever foo.gz . Não parece haver uma opção de linha de comando para forçar o gzip a deixar apenas .gz arquivos ... uma versão não interativa de pressionar 'n' no prompt.

Eu tentei gzip --noforce e gzip --no-force , esperando que eles pudessem seguir o padrão de opções GNU, mas nenhum deles funcionou.

Existe uma solução 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 man.

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.

A página man faltava o texto e quando não estava sendo executado em segundo plano

Quando executado em segundo plano, o gzip não irá avisar e não irá sobrescrever a menos que a opção -f seja invocada.

    
por Barton Chittenden 16.04.2013 / 17:42

2 respostas

8

Percebi que a melhor maneira de evitar o efeito indesejado é não solicitar ao programa que realize o efeito indesejado. Isto é, simplesmente não diga para comprimir um arquivo se o arquivo já estiver presente em formato comprimido.

por exemplo:

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

ou menor (execute true se houver um arquivo.gz, comprima o arquivo de outra forma)

[ -f "$file.gz" ] && echo "skipping $file" || gzip "$file"    
    
por 16.04.2013 / 18:12
9

A coisa mais próxima que encontrei de um único comando é a seguinte:

yes n | gzip archive/foo

O comando yes imprime y seguido de um avanço de linha para stdout até receber um sinal. Se tiver um argumento, ele imprimirá isso em vez de y . Neste caso, imprime n até o gzip sair, fechando assim o tubo.

Isso equivale a digitar n repetidamente no teclado; isso responderá automaticamente à pergunta gzip: archive/foo.gz already exists; do you wish to overwrite (y or n)?

Em geral, penso que é melhor não tentar compactar os arquivos se o arquivo gzipado correspondente existir; minha solução é mais barulhenta, mas atende às minhas necessidades específicas de substituição imediata do comando gzip , em um arquivo de configuração.

    
por 16.04.2013 / 18:52