Preciso excluir todos os dados compilados:
- diretórios chamados
build
, - diretórios chamados
obj
, - arquivos * .so.
Eu escrevi um comando
find \( -name build -o -name obj -o -name *.so \) -exec rm -rf {} \;
que percorre todos os diretórios recursivamente e exclui tudo o que preciso.
Por que eu tenho essa saída no final? Talvez eu deva escrever um comando diferente.
find: `./3/obj': No such file or directory
find: `./3/build': No such file or directory
find: `./1/obj': No such file or directory
find: `./1/build': No such file or directory
find: `./2/obj': No such file or directory
find: `./2/build': No such file or directory
find
como estafind /search_directory options
omiting o diretório de pesquisa não é uma boa idéiaRespostas:
Use
-prune
os diretórios que você deseja excluir de qualquer maneira para dizerfind
para não se preocupar em tentar encontrar arquivos neles:Observe também que
*.so
precisa ser citado, caso contrário, ele pode ser expandido pelo shell para a lista de.so
arquivos no diretório atual.O equivalente ao seu GNU-
-regex
type seria:Observe que se você usar a sintaxe específica do GNU, poderá usar em
-delete
vez de-exec rm -rf {} +
. Com-delete
, o GNUfind
liga-depth
automaticamente. Ele não executa comandos externos, dessa forma, é mais eficiente e também mais seguro, pois remove a condição de corrida em que alguém pode fazer com que você remova os arquivos errados, alterando um diretório para um link simbólico entre as horasfind
localiza um arquivo e orm
remove (consulteinfo -f find -n 'Security Considerations for find'
para obter detalhes).fonte
-delete
também lida com coisas como espaços melhor-exec rm -rf {} +
que também não tem problema.{}
- devem ser citados ou não? Parece funcionar sem aspas, mas o GNU Findutils Manual usa'{}'
no exemplo. Você poderia por favor esclarecer?csh
, mas nunca pude verificar essa reivindicação. Eles não são necessários em nenhum shell moderno que eu conheça. Definitivamente, eles não são exigidos pelo POSIX. Os exemplos POSIX não os usam.-delete
não pode ser usado com diretórios.Acho que o motivo é que ele
find
exclui a árvore de diretórios primeiro e tenta verificar o conteúdo do diretório, o que obviamente não é a melhor ordem possível. Você pode forçarfind
a verificar o conteúdo primeiro:Você deve considerar o uso
-delete
de arquivos e-exec rmdir
diretórios.fonte
Minha solução
+ vs \; no comando -exec
fonte
-exec … {} +
executa o comando para vários arquivos de cada vez, quantos cabem na linha de comando. Se houver muitos arquivos (ou mais precisamente, se o comprimento total dos caminhos for muito longo),find
será executada várias instâncias derm
, e, portanto, poderá acabar removendo um diretório que ele está percorrendo. É apenas menos provável com o+
que com;
, mas+
não resolve o problema.