GNU encontrar com -exec rm remove correspondências, depois reclama que elas não existem

4

Eu tenho um diretório /domains no qual tenho entradas como

theawesomesite.com
0.2.v.theawesomesite.com
0.3.v.theawesomesite.com

Depois de testar o 0.3, configurarei o domínio principal para alias a nova versão. Funciona muito bem. Agora, quero poder excluir todas as versões antigas. Eu tentei isso:

find /domains -name "*.v.theawesomesite.com" -not -name "0.3.v.*" -ignore_readdir_race -exec rm -fr {} \;

Os diretórios do domínio antigo são excluídos, mas para cada um deles find reclama No such file or directory . Eu adicionei o -ignore_readdir_race sob a idéia que ajudaria, mas não o fez.

Alguma idéia de como se livrar dessas reclamações e por que find está reclamando em primeiro lugar. Tem que ser stat ing após o -exec mas não consigo descobrir o porquê.

    
por ironfroggy 09.01.2010 / 17:13

4 respostas

3

Tente adicionar o -depth flag para processar o conteúdo de cada diretório antes do próprio diretório.

EDIT by Asker: Ou o sinalizador -prune, já que eu não me importo com o conteúdo. Sua sugestão me fez pensar sobre isso pesquisando nos diretórios depois de deletá-los, o que eu não considerei, e me deu a resposta final, então eu queria fazer essa a resposta correta que eu realmente usei.

    
por 09.01.2010 / 17:24
1

Você pode usar -delete action em vez de -exec (desde que tenha encontrado recentemente).

    
por 09.01.2010 / 17:59
1

É melhor salvá-lo quando precisar recapitular diretórios, o que não parece que você faz. Nesse caso, eu faria apenas uma mágica de shell. As opções incluem:

for dir in *.v.theawesomesite.com
    [[ $dir == 0.3.v.theawesomesite.com ]] || rm -r $dir
done

Ou:

echo *.v.theawesomesite.com | grep -v '^0.3.v.theawesomesite.com$' | xargs rm -r

Ou até mesmo:

mv 0.3.v.theawesomesite.com 0.3.v.theawesomesite.com.SAVED
rm -r *.v.theawesomesite.com
mv 0.3.v.theawesomesite.com.SAVED 0.3.v.theawesomesite.com
    
por 12.01.2010 / 21:00
0

Tente usar aspas simples em vez de aspas duplas.

O shell expande aspas duplas antes de passá-las para find , portanto, pode estar rm'ing o diretório antes dos arquivos:

find /domains -name 0.2.v.theawesomesite.com 0.2.v.theawesomesite.com/file1 ...

Portanto, ele pode processar o diretório primeiro e depois procurar os arquivos que ele acabou de excluir.

    
por 09.01.2010 / 17:22