Eu tenho uma lista de arquivos - resultado do comando find, como posso usá-lo para zip / tar os arquivos e excluir os arquivos originais

2

Eu tenho uma lista de arquivos do comando find . Como posso zip / tar os arquivos e excluir os arquivos originais? Os resultados são de: find . -type f -exec egrep "mxprod|nlsoprdc" {} /dev/null \; ; Como posso zipar o arquivo e excluir os originais?

    
por kavya 10.08.2017 / 08:36

1 resposta

3

Com as ferramentas do GNU, você pode fazer:

find . -type f -exec grep --null -El 'mxprod|nlsoprdc' {} + |
  tar --xz -cf /path/to/file.tar.xz --remove-files --null -T -

Embora para esse uso específico de find , você poderia acabar com ele e usar o grep do GNU -r .

grep -r --null -El 'mxprod|nlsoprdc' . |
  tar --xz -cf /path/to/file.tar.xz --remove-files --null -T -

Observe que os diretórios nos quais os arquivos encontrados estão não são adicionados como membros do arquivo. Eles serão recriados ao extrair o arquivo, mas não com os metadados originais (propriedade, permissões, ACLs, outros atributos ...) dos originais.

Você poderia resolver isso fazendo:

grep -r --null -El 'mxprod|nlsoprdc' . |
  awk -F/ -v RS='
find . -type f -exec grep --null -El 'mxprod|nlsoprdc' {} + |
  tar --xz -cf /path/to/file.tar.xz --remove-files --null -T -
' -v ORS='
grep -r --null -El 'mxprod|nlsoprdc' . |
  tar --xz -cf /path/to/file.tar.xz --remove-files --null -T -
' '{ p=""; sep="" for (i = 1; i < NF; i++) { p = p sep $i; sep=FS if (! (p in dirs)) { print p dirs[p] } } print}' | tar --xz -cf /path/to/file.tar.xz --no-recursion --remove-files --null -T -

Embora você veja erros sobre os diretórios que tar não pode remover porque não estão vazios.

Em qualquer caso, observe que é perigoso se, por exemplo, o sistema de arquivos ficar cheio, xz poderia falhar ao gravar a saída de um determinado arquivo depois que tar já o tenha removido.

Pode ser melhor começar a remover arquivos somente depois de ter certeza de que o arquivo foi criado corretamente.

    
por 10.08.2017 / 09:01

Tags