Como evitar sobrescrever arquivos existentes enquanto estiver usando o comando tar?

2

O comando tar acabou de substituir meu arquivo uma hora atrás enquanto eu tentava fazer um tar para fazer o backup dele.

eu corri

tar zcvf foo.tex foo.bib

e depois disso meu arquivo de origem tex perdeu. O que é pior, esta é a segunda vez que eu perdi meu arquivo dessa maneira.

Eu uso o gvim, mas o comando 'u' pode recuperar meu arquivo. Depois de procurar algumas entradas de ajuda sobre 'backup', 'undofile', eu simplesmente não consigo encontrar uma maneira de evitar que o comando tar substitua meu arquivo novamente.

Então eu tento encontrar um parâmetro como '-i' de cp ou mv , mas entre os muitos parâmetros de tar eu posso encontre um.

Eu me pergunto como posso evitar que esse tipo de coisa aconteça novamente, pois estou um pouco inseguro sobre lembrar de adicionar a nova coisa foo.tar que eu sempre esqueço da próxima vez.

    
por bigeast 04.06.2013 / 18:37

6 respostas

2

Adicione isto ao seu arquivo .bash_login . alias tar=tar --backup=simple Isso adicionará um ~ ao arquivo que ele está prestes a sobrescrever.

Então, quando você cria o arquivo, ele sempre é executado

tar --backup=simple zcvf foo.tex foo.bib

e após a execução um foo.tex ~ existirá (este é o arquivo tex real e o arquivo estará em foo.tex)

    
por 04.06.2013 / 18:59
1

Use o redirecionamento de saída em vez de especificar um nome de arquivo. Isso se aplica a muitos comandos, não apenas ao tar.

É claro que você tem set -o noclobber (também escrito set -C ) no seu .bashrc , certo?

$ tar zc >foo.tex foo.bib
bash: foo.tex: cannot overwrite existing file

Se você costuma emitir este comando, não o digite manualmente: escreva um makefile .

foo.tar.gz: foo.tex foo.bib
        tar czf $@ $^

Use tarballs somente quando precisar enviá-los para outra pessoa, para não fazer backups. Em vez de fazer backups de versões antigas, use o controle de versão (CVS, Mercurial, Git, etc., o que flutua no seu barco) . (Faça backup do repositório caso seu disco falhe ou você acidentalmente manuseie ou apague o repositório.)

    
por 05.06.2013 / 01:44
1

Esse problema ocorre porque as opções 'curtas' para tar permitem que você combine as coisas de uma forma que ofusque a foo.tex pertencente à opção f .

A versão completa do seu comando (com uma versão moderna de tar ) seria:

tar --create --file foo.tex --gzip --verbose foo.big

ou com opções abreviadas:

tar -c -f foo.tex -z -v foo.big

Esses são, na minha experiência, muito mais obviamente gravados incorretamente em um arquivo foo.tex .

Se você fizesse:

tar --create --file --gzip --verbose foo.tex foo.big

Você obtém um arquivo --gzip , e isso é algo que eu espero que você não use regularmente como nome de arquivo, para que a sobrescrita não seja um problema. (BTW você pode remover um arquivo com tal nome de arquivo com rm -- --gzip .)

As opções de um caractere para tar sem - são uma maneira antiga / original de especificar opções. Dinossauros Unix, como eu, tendem a usá-los, mas eu acho que eles são confusos. Eu recomendo usar as versões 'tracejadas' mais completas separadamente até que você se sinta mais confiante usando tar .

    
por 05.06.2013 / 11:46
0

Você pode preferir o comportamento de 7z (7-Zip). Não consegui substituí-lo por um arquivo existente durante a compactação. Suporta saída tar ( -t tar ).

Também tem o atool - tentei e a interface parece legal:

apack a b
apack: a: format not known, identifying using file
apack: a: format is 'tar'
apack: a: refusing to overwrite existing file
    
por 04.06.2013 / 19:17
0

Primeiro, é muito fácil lembrar os caracteres certos:

  • czf = criar arquivo compactado
  • xzf = extrair arquivo compactado

Se você pensa assim, deve sempre acertar.

A outra coisa com dados importantes é tê-lo em algum controle de versão. Eu recomendo git para isso. Ele salvará todo o seu histórico localmente e permitirá que você envie tudo para qualquer outro meio. - Muito útil e sem mais backups usando tar.

    
por 04.06.2013 / 19:26
0

Não sei ao certo por que você está dando o mesmo nome de arquivo de sua fonte para a tarball.

se o arquivo de origem for foo.tex e precisar ser arquivado, faça o seguinte:

tar zcvf foo.tgz foo.tex

se houver arquivos múltiplos, faça o seguinte

 tar zcvf foo.tgz foo.tex foo.bib 

Se você está tentando fazer uma tarball incremental, use este link . Eu não tentei ainda, mas eu acho que é melhor usar o git se você está tentando fazer o controle de versão.

    
por 04.06.2013 / 23:35