Encontre para listar todos os arquivos com o padrão de data para juntá-los

2

Eu tenho um diretório com muitos arquivos de log, com nomes de arquivos como acct.20111001 até acct.20111030 . Quero zip-los executando:

tar -cvjf acct.20111001.bz2 acct.20111001

Como posso usar find para compactá-los em vez de executar o comando tar para cada arquivo?

Estou pensando em algo assim, mas sei que esse comando não funciona:

find /home/log/2011/10 -name "acct.201110[0-9]" -exec tar -cvjf {}.bz2 {} \;
    
por user11496 22.11.2011 / 10:47

3 respostas

5

A expressão regular que você usou com find não corresponde a todos os arquivos no intervalo acct.20111001 a acct.20111030 , porque você esqueceu o último dígito . Se está tudo bem para você também coincidir com acct.20111000 (caso exista, o que duvido que seja a partir da data-look dos nomes), você pode usar

find /home/log/2011/10 -name "acct.201110[0-3][0-9]" -exec tar -cvjf {}.bz2 {} \;

Outra opção, especialmente quando você tem poucos arquivos para operar (menos de centenas), é não usar find , mas sim um simples loop for . Você pode usar a expressão de intervalo que resulta em uma lista de números preenchidos com zero:

 for file in acct.201110{01..30}; do tar -cvjf $file.bz2 $file; done

Ainda outra opção é possível se acct.20111001 a acct.20111030 forem os únicos arquivos que começam com acct.201110 (o que, novamente, eu suspeito ser o caso) - então você pode apenas use acct.201110* com qualquer um dos comandos acima mencionados.

    
por 22.11.2011 / 18:17
1

Algo como

for file in acct.201110[0-9]; do tar -cvjf $file.bz2 $file; done

deve funcionar (talvez com um glob melhor para capturar todos os dias), mas seu problema parece logrotate ou Newsyslog é o que você pode precisar.

    
por 22.11.2011 / 11:00
0

A ferramenta que você deseja para isso é cpio (1) . Isto levará uma lista de arquivos de stdin e produzirá um arquivo. Se você precisar produzir um arquivo no formato tar, use a opção -H tar .

    
por 22.11.2011 / 16:36

Tags