Por que o / rm -iname '* phpmyadmin' não exclui o phpMyAdmin-Version-XYZ.zip?

8

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 -rfarquivo, 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).

  1. Existe uma maneira de excluir qualquer inode em uma única rm (arquivo, dir, softlink)?
  2. Por que adicionar o -inamenão tem efeito?

Nota: Não encontrei um argumento "excluir qualquer inode" em man rm.

derobert
fonte
1
Se o seu findsuporte, tente a -deleteaçã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.)
Zwol

Respostas:

31

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ência phpmyadmin(sem distinção entre maiúsculas e minúsculas), use -iname '*phpmyadmin*':

find ./ -iname '*phpmyadmin*' -exec rm -rf {} \;

Talvez seja sensato obter os arquivos correspondentes antes da remoção:

find ./ -iname '*phpmyadmin*'

Para responder sua primeira pergunta, não há opção rmno espaço do usuário para lidar com inodes.

heemail
fonte
1
Possivelmente, deve-se considerar -depthque findnão tente recursar em um diretório que acabou de ser excluído.
roaima 5/05
8
Para não tirar nada da resposta, o que inclui isso, mas só queria enfatizar que o motivo pelo qual o comando do OP não excluiu o arquivo zip foi que ele não o encontrou , devido à falta de rastreamento '* 'no padrão.
Gwyn Evans
3
@GwynEvans Isso também significa que OP não testou o findantes de adicionar o -execparâmetro. Muito perigoso.
Tulains Córdova
Pode sugerir -exec rm -rf {} +- não há razão para a penalidade de desempenho de executar um rmpor arquivo.
Charles Duffy
2
find ./ -iname '*phpmyadmin*' -exec /usr/lib/klibc/bin/nuke {} +

Isso funciona mesmo se alguém criar um diretório -phpmyadmin.

Joshua
fonte
Find (pelo menos aqui) prefixa os nomes com ./, para que não seja necessário: ele seria executado rm -rf ./-phpmyadmin, o que deve funcionar com qualquer sã rm. Tente find ./ -iname '*whatever*' -exec echo '{}' ';'testar
derobert 5/17
@derobert: Eu já estraguei tudo em algumas ocasiões. Uma vez mordido, duas vezes tímido. Talvez isso só possa acontecer se o argumento a encontrar for algo como '-noyingdirectoryname'.
Joshua
1
Se alguém executou, digamos, em find */vez de find ., 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 ).
Charles Duffy
1
Como um aparte - {} +é consideravelmente mais eficiente que {} \;, pois executará apenas quantas instâncias do seu comando ( nukeneste caso) forem necessárias para caber em todos os itens encontrados na linha de comando, em vez de um por cada.
Charles Duffy
@CharlesDuffy Se eles rodassem find */, o problema não ocorreria -exec, o diretório com um hífen pareceria ser uma findopção e ela reclamaria.
Barmar 6/05