Como coletar todos os arquivos “txt” e “log” usando find?

5

Atualmente tenho este script:

find . -iname '*.log' -print0 | xargs -0 tar zcf $file

Para coletar todos os arquivos "* .log" de um determinado diretório. Eu gostaria de modificá-lo para incluir também todos os arquivos ".txt", mas eu não sei como, isso deve ser bastante simples, certo?

    
por OscarRyz 04.01.2011 / 22:23

5 respostas

2

Você está no caminho certo. Tente isto:

find . \( -iname "*.log" -or -iname "*.txt" \) -print0 | xargs -0 tar zcf $file

    
por Raphael Bossek 04.01.2011 / 22:44
4

Isso é quase o mesmo que a resposta de Raphael B., mas que também lidará com a extensão máxima do argumento. Fazemos isso simplesmente dizendo tar para ler os nomes dos arquivos para arquivar a partir de stdin (onde não há limite) em vez de esperá-los como argumentos:

find . \( -iname "*.log" -o -iname "*.txt" \) -print0 | tar --null --files-from=- -zcf "$file"

Note que isso é específico do GNU. tar em outros sistemas UNIX ou UNIX não entende --null , mas o tar no Ubuntu é o GNU tar, então vai funcionar bem lá.

    
por geirha 20.01.2011 / 20:51
2

Aqui está a resposta para o uso inútil de xargs:

find \( -name "*.log" -or -name "*.txt" \) -exec tar zcf archiv2 {} + 

Eu não testei muitos arquivos - ficaria feliz com um comentário e um número, onde ele falha.

O pseudo-argumento, que você precisa lembrar para colocar o -delete como último: Bem, sim, você também tem que lembrar de colocar | xargs ... como último, não é?

    
por user unknown 20.03.2011 / 01:53
1

E esta abordagem muito simples:

find -iname '*.txt'; find -iname '*.log'
    
por Ralf Hersel 04.01.2011 / 22:54
1
find . -regextype posix-extended -iregex '.*\.(log|txt)' -print0 | xargs -0 tar zcf $file

Você pode substituir o '.*\.(log|txt)' por qualquer expressão regular POSIX Extended .

O exemplo corresponde:

  

Qualquer número de qualquer caractere

     

então um '.'

     

depois "log" ou "txt"

    
por dv3500ea 04.01.2011 / 22:51

Tags