como usar a opção tar '--remove-files' dentro de find -exec?

1

Eu tenho um número de arquivos de log muito grandes que eu quero comprimir individualmente para que eu não possa usar xargs ou pipe stdout para obter um enorme arquivo compactado.

Estou tentando fazer isso:

find . -mtime +1 -iname "*.log" -exec tar -jcvf {} --remove-files \; 

Mas eu recebo:

tar: Cowardly refusing to create an empty archive
Try 'tar --help' or 'tar --usage' for more information.

Eu tentei escapar do traço duplo (-), que acredito ser o problema, sem sucesso.

E sim, o find realmente encontra um arquivo:

find . -mtime +1 -iname "*.log" 
./20141002.tcp.log                  # just a test file...

Alguém poderia me dizer o que estou fazendo de errado?

Obrigado!

    
por Makimoto Marakatti 20.10.2014 / 16:18

2 respostas

1

Tar está reclamando porque você esqueceu de passar um argumento à sua opção -f , não por causa do -- que você suspeitava.

Aqui está uma maneira de corrigir seu comando que funciona com GNU tar , o que provavelmente é o que você está usando:

find . -mtime +1 -iname "*.log" -exec tar --remove-files -jcvf {}.tar.bz2 {} \; 

Caso sua implementação de find queira que {} fique só, como o padrão POSIX especifica, você pode executar:

find . -mtime +1 -iname "*.log" -exec sh -c 'tar --remove-files -jcvf $1.tar.bz2 $1' sh {} \; 
    
por 22.10.2014 / 11:52
1

Eu vou responder a minha própria pergunta apenas por uma questão de perfeição.

Como não consegui excluir os arquivos de origem enquanto eles estavam sendo compactados, acabei de fazer um script pequenino para desfazê-los manualmente. Não é extravagante, mas viver em cron faz maravilhas: minha ocupação vol foi de 60% para 10%.

aqui o script

#!/bin/bash
find /var/log/remote -mtime +1 -iname "*.log" > /tmp/tmp_file
for i in $(cat /tmp/tmp_file) ; do tar jcvf $i.bz2 $i && rm -rf $i ; done 
rm -rf /tmp/tmp_file
    
por 22.10.2014 / 10:00

Tags