Eu tenho este código a seguir:
find ./ -iname '*phpmyadmin' -exec rm -rf {} \;
Exclui um diretório chamado phpmyadmin
, mas não exclui um arquivo chamadophpMyAdmin-Version-XYZ.zip
Mesmo se eu remover o -rf
arquivo, ele ainda não o excluirá (provavelmente porque um segundo problema com o nome -in não afeta a distinção entre maiúsculas e minúsculas).
- Existe uma maneira de excluir qualquer inode em uma única rm (arquivo, dir, softlink)?
- Por que adicionar o
-iname
não tem efeito?
Nota: Não encontrei um argumento "excluir qualquer inode" em man rm
.
find
suporte, tente a-delete
ação. (Além disso, veja gnu.org/software/findutils/manual/html_node/find_html/... para ampla discussão das muitas maneiras de fazer isso de forma incorreta.)Respostas:
O problema é que você está correspondendo a um arquivo que termina
phpmyadmin
( sem distinção entre maiúsculas e minúsculas ) usando o padrão*phpmyadmin
. Para obter qualquer arquivo que contenha a sequênciaphpmyadmin
(sem distinção entre maiúsculas e minúsculas), use-iname '*phpmyadmin*'
:Talvez seja sensato obter os arquivos correspondentes antes da remoção:
Para responder sua primeira pergunta, não há opção
rm
no espaço do usuário para lidar com inodes.fonte
-depth
quefind
não tente recursar em um diretório que acabou de ser excluído.find
antes de adicionar o-exec
parâmetro. Muito perigoso.-exec rm -rf {} +
- não há razão para a penalidade de desempenho de executar umrm
por arquivo.Isso funciona mesmo se alguém criar um diretório -phpmyadmin.
fonte
./
, para que não seja necessário: ele seria executadorm -rf ./-phpmyadmin
, o que deve funcionar com qualquer sãrm
. Tentefind ./ -iname '*whatever*' -exec echo '{}' ';'
testarfind */
vez defind .
, o faria (se um nome de diretório correspondente começar com um traço). Dito isso, eu tenderia a sugerir o uso--
para lidar com esses casos, fornecendo um fim de opções explícito antes do{}
argumento. (Consulte o item 10 nas diretrizes de sintaxe do utilitário POSIX ).{} +
é consideravelmente mais eficiente que{} \;
, pois executará apenas quantas instâncias do seu comando (nuke
neste caso) forem necessárias para caber em todos os itens encontrados na linha de comando, em vez de um por cada.find */
, o problema não ocorreria-exec
, o diretório com um hífen pareceria ser umafind
opção e ela reclamaria.