Encontre os arquivos correspondentes e remova o modelo

3

Eu tenho uma grande quantidade de pastas e arquivos. Eu preciso analisá-lo e encontrar apenas aqueles com a extensão xmp para finalmente removê-los.

Como posso conseguir isso e acompanhar o nome dos arquivos removidos?

Para encontrar: eu sei que posso usar find /path -name "*.xmp" Mas como posso executar dois comandos na saída? mantenha o caminho e o nome do arquivo em removelist.txt e remova-o.

    
por Kevin Lemaire 26.01.2018 / 10:53

3 respostas

8

Com as ações do GNU encontrar -fprint e -delete :

find . -name "*.xmp" -fprint "removelist.txt" -delete
  • -fprint file - imprime o nome completo do arquivo no arquivo file . Se file não existir quando find for executado, ele será criado; se existir, será truncado.
  • -delete - excluir arquivos
por 26.01.2018 / 11:11
2

Uma maneira é executar um comando shell composto com -exec :

find /path -name '*.xmp' -exec sh -c 'echo "$1" >> removelist.txt && rm -f "$1"' sh {} \;

Dentro de um sub-shell, tanto echo (anexado a removelist.txt ) quanto rm serão executados em cada arquivo encontrado.

Observação: o último sh é porque estamos usando -c . Com esse sinalizador, o primeiro argumento a seguir é o param 0 ou $0 , que deve ser o nome do shell.

Tenho que admitir, @RomanPerekhrest tem uma resposta melhor para este caso em particular, mas com a técnica aqui você pode fazer todo tipo de coisas para as quais pode não haver um flag find dedicado. :)

    
por 26.01.2018 / 11:01
2

Para registrar os arquivos que foram removidos com sucesso, você pode fazer:

find . -name '*.xmp' -exec rm -f {} \; -print > removed.txt

A ação -print será executada somente se a ação -exec for bem-sucedida, ou seja, se rm tiver êxito.

Com algumas implementações find , você pode substituir o -exec rm -f {} \; por -delete para evitar a execução de um comando para cada arquivo e evitar algumas condições de corrida (inicialmente uma extensão FreeBSD, mas agora suportada pelo GNU find e alguns outros).

    
por 26.01.2018 / 13:44