Como posso excluir um arquivo específico de um conjunto de resultados usando o comando find no Linux?

Como posso excluir um arquivo específico de um conjunto de resultados usando o comando find no Linux?

Eu tenho o seguinte comando que lista todos os arquivos com extensão doc,, docxetc.

find . -maxdepth 1 -iname \*.doc\*

O comando retorna vários arquivos, alguns dos quais eu gostaria de excluir. Então, por exemplo, os resultados retornados são

  1. Exemplo.docx
  2. Dummydata.doc
  3. Exemplo.doc

Gostaria de excluir Sample.doc e Dummydata.docx. Como excluo os arquivos usando a -execopção. Consigo passar os nomes dos arquivos, por exemplo, rm Dummydata.docx Sample.doco comando ficaria assim

find . -maxdepth 1 -iname \*.doc\* -exec rm Dummydata.docx Sample.doc

Posso passar os nomes dos arquivos dentro {} afterdo rm`? por exemplo

find . -maxdepth 1 -iname \*.doc\* -exec rm {Dummydata.docx} Sample.doc

Existe uma maneira melhor de fazer isso?

Responder1

Se você souber os nomes dos arquivos com antecedência, será mais fácil removê-los imediatamente:

find . -iname "Dummydata.doc" -delete

Ou, com múltiplas condições:

find . \( -iname "Dummydata.doc" -o -iname "Sample.doc" \)

Os parênteses forçam a preferência, mas você precisa escapá-los ou citá-los, pois normalmente os parênteses têm um significado especial para o seu shell.


Caso contrário, se quiser examinar primeiro a lista de resultados, você pode passar o caminho dos arquivos encontrados – aqui, colocados em {}– para sh. Para o shcomando, o caminho se tornará $0, e você pode compará-lo com o nome do arquivo que deseja remover:

find . -maxdepth 1 -iname "*.doc" \
-exec sh -c 'if [ "$0" == "Dummydata.doc" ] || [ "$0" == "Sample.doc" ]; then echo rm "$0"; fi' {} \;

Aqui, remova echoquando tiver certeza de que o arquivo correto será removido. Mas temo que será mais fácil remover manualmente os arquivos.

informação relacionada