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.


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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.