Você está no caminho certo. Tente isto:
find . \( -iname "*.log" -or -iname "*.txt" \) -print0 | xargs -0 tar zcf $file
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?
Você está no caminho certo. Tente isto:
find . \( -iname "*.log" -or -iname "*.txt" \) -print0 | xargs -0 tar zcf $file
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á.
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 é?
E esta abordagem muito simples:
find -iname '*.txt'; find -iname '*.log'
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"