Remover recursivamente os mesmos arquivos encontrados com o locate

1

Parece que essa pergunta foi feita de várias maneiras. Mas eu gostaria de usar rm em vez de find .

Eu segui várias explicações sobre como usar find , mas estou tendo um problema com a execução do comando find . Quando eu uso locate, recebo a seguinte saída:

maxgitt@mgpc:/etc$ locate omero
/etc/nginx/conf.d/omeroweb.conf
/etc/rc0.d/K01omero-web
/etc/rc1.d/K01omero-web
/etc/rc2.d/S03omero-web
/etc/rc3.d/S03omero-web
/etc/rc4.d/S03omero-web
/etc/rc5.d/S03omero-web
/etc/rc6.d/K01omero-web

Mas quando tento usar find para excluir os arquivos respectivos, recebo o seguinte erro.

maxgitt@mgpc:/etc$ find -type f -name '*omero*'
./etc/rc0.d/K01omero-web
./etc/rc1.d/K01omero-web
./etc/rc2.d/S03omero-web
./etc/rc3.d/S03omero-web
./etc/rc4.d/S03omero-web
./etc/rc5.d/S03omero-web
./etc/rc6.d/K01omero-web
find: ‘./cups/ssl’: Permission denied
find: ‘./ppp/peers’: Permission denied
find: ‘./polkit-1/localauthority’: Permission denied
find: ‘./ssl/private’: Permission denied
./nginx/conf.d/omeroweb.conf
find: ‘./chatscripts’: Permission denied
find: ‘./docker’: Permission denied

Então, optei por usar o comando:

maxgitt@mgpc:/etc$ sudo rm -rf /etc/*/*omero-web*

Mas eu preferiria poder remover todos os arquivos dentro do diretório etc/ e seus respectivos subdiretórios. Eu fiquei com um arquivo por causa do meu comando hacky rm :

maxgitt@mgpc:/etc$ locate omero
/etc/nginx/conf.d/omeroweb.conf
    
por Max 05.10.2017 / 19:09

3 respostas

4

Use o sudo

E sempre faça um teste antes de excluir para garantir que você não está removendo mais do que esperava.

sudo find -type f -name '*omero*'

Em seguida, supondo que a lista parece ser boa

    sudo find -type f -name '*omero*' -delete

ou especifique um local para pesquisar (você já sabe que esses arquivos estão em / etc)

sudo find /etc -iname '*omero*' -delete

-eliminar é mais rápido que -exec rm {} \; ou -print0 | xargs -0 rm , pois não precisa gerar outro processo.

EDIT: Dos comentários

for i in $(locate omero) ; do rm $i ; done
    
por Panther 05.10.2017 / 19:14
3

Você só precisa adicionar o sudo ao seu comando:

sudo find /etc -type f -name '*omero*' -delete

e o erro desaparecerá. Razão é que esses arquivos são de propriedade de root user e só podem ser removidos por aqueles no grupo sudo e usuário root.

    
por George Udosen 05.10.2017 / 19:17
1

Existem muitas razões para usar o find ao invés do rm. Especialmente se a sua versão do find suporta a opção "-delete":

  • Se seus nomes de arquivos contiverem espaços ou novas linhas, o comando rm não funcionará e poderá até mesmo excluir os arquivos incorretos.
  • Se houver muitos arquivos para excluir, o comando falhará por exceder o comprimento máximo da linha de comando.

Se a sua pesquisa for compatível com "-delete":

find -type f -path "*omero*" -delete

Se a sua localização não suportar "-delete" e exija um caminho inicial:

find . -type f -path "*omero*" -print0 | xargs -0 rm

Esse ' -print0 ... -0 ' é importante. Isto diz para localizar nomes de arquivos de saída delimitados por NUL, e xargs -0 irá esperar nomes de arquivos delimitados por NUL. Desta forma, espaços e novas linhas em seus nomes de arquivos não causam problemas.

Além disso, estou usando -path em vez de -name para corresponder mais de perto ao que "locate" fornece a você. No entanto, isso significa que um arquivo será excluído se estiver sob um diretório com "omero". Provavelmente não é isso que você deseja e você deve usar -name .

Com isso fora do caminho, se você tiver certeza do que obteve no final, coloque sudo na frente da primeira versão. Ou sudo na frente de ambos os find e xargs no segundo.

    
por Chris Cogdon 06.10.2017 / 00:11