Usando tar com find

2

Digamos que queremos encontrar alguns arquivos, usar o tar e deletá-los. Eu tentei usar

touch "mycompress.bz2.tar"
find . \( -name "*.c" -o -name "*.sh*" \) -exec tar ujf "mycompress.bz2.tar" {} "+" \; -exec rm {} \;

Mas a execução deste meu terminal é fechada. Como posso implementar isso corretamente?

    
por trolkura 13.05.2016 / 10:33

2 respostas

5

Existem vários problemas com o seu comando.

O primeiro é um arquivo compactado não pode ser atualizado. Você precisaria primeiro criar um arquivo descompactado, atualizá-lo e, finalmente, compactá-lo.

O segundo é que a sintaxe tar está incorreta, a primeira cláusula -exec deve usar o + terminator ou o \; , mas não os dois.

O terceiro é mais sutil e ocorre se você mantiver o + terminator, a segunda cláusula -exec será executada para cada arquivo em sequência, enquanto o primeiro aguardará a lista de arquivos para salvar o arquivo. seqüência de ambiente a ser lançada. Quando isso acontecer, todos os arquivos a serem armazenados pelo primeiro -exec já terão sido excluídos pelo segundo -exec , então tar falhará e você perderá todos os seus arquivos.

Como não há dúvida de que você está usando GNU tar , aqui está uma maneira simples de alcançar o que você deseja:

tar --files-from <(find . \( -name "*.c" -o -name "*.sh*" \)) \
    --remove-files -cjf mycompress.bz2.tar

O GNU tar é documentado para remover os arquivos somente depois de salvos:

$ man gtar
...
       --remove-files
              remove files after adding them to the archive
...

Observe que o comando que sugeri não processará arquivos com uma nova linha incorporada, mas esse deve ser um evento bastante improvável.

    
por 13.05.2016 / 11:36
-3

Com uma das implementações usuais de tar , isso não funciona.

Há uma implementação tar livre desde 1982, chamada star .

star adicionou um utilitário find integrado em 2005 com base no meu libfind .

Você chama star -c -f file.out -find . \( -name "*.c" -o -name "*.sh*" \)

As regras para o incorporado em find são simples: tudo à direita de -find segue as regras da linha de comando para find(1) .

Veja o link

e a man page star em: link

Existe uma fonte separada (consulte o site), mas a versão mais recente e melhor é atualmente parte do schilytools .

Por favor, tenha em mente que o seu desejo de remover os arquivos durante o seu arquivamento é altamente arriscado, pois pode haver um problema com o seu comando e você teria removido arquivos que você não pode mais usar com uma segunda tentativa. Assim, eu recomendo primeiro usar minha proposta para arquivar os arquivos e depois ligar:

rm $(star -t -tpath < file.out)

Isso só removerá arquivos que foram colocados com sucesso no arquivo.

    
por 13.05.2016 / 10:57