Perché non trova / rm -iname '* phpmyadmin' elimina phpMyAdmin-Version-XYZ.zip?


8

Ho questo codice seguente:

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

Si elimina una directory chiamata phpmyadmin, ma non eliminare un file chiamatophpMyAdmin-Version-XYZ.zip

Anche se rimuovo -rf, non lo cancellerà (probabilmente perché un secondo problema con il -iname non influenza l'insensibilità al caso).

  1. C'è un modo per eliminare qualsiasi inode in un singolo rm (file, dir, softlink)?
  2. Perché l'aggiunta di -inamenon ha effetto?

Nota: non ho trovato un argomento "Elimina qualsiasi inode" in man rm.


1
Se findlo supporta, provare l' -deleteazione. (Vedi anche gnu.org/software/findutils/manual/html_node/find_html/… per una discussione approfondita dei molti modi per farlo in modo errato.)
zwol

Risposte:


31

Il problema è che stai abbinando un file che termina phpmyadmin(senza distinzione tra maiuscole e minuscole ) usando il modello *phpmyadmin. Per ottenere qualsiasi file che contiene la stringa phpmyadmin(senza distinzione tra maiuscole e minuscole), utilizzare -iname '*phpmyadmin*':

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

Forse ottenere i file corrispondenti prima della rimozione sarebbe sano:

find ./ -iname '*phpmyadmin*'

Per rispondere alla tua prima domanda, rmnello spazio utenti non è disponibile alcuna opzione per gestire gli inode.


1
Molto probabilmente dovrebbe considerare in -depthmodo che findnon provi a rientrare in una directory è appena cancellato.
roaima,

8
Non togliere nulla dalla risposta, che include questo, ma volevo solo sottolineare che il motivo per cui il comando del PO non ha eliminato il file zip è che non lo ha trovato , a causa della mancanza del trascinamento '* 'sul modello.
Gwyn Evans,

3
@GwynEvans Significa anche che OP non ha testato findprima di aggiungere il -execparametro. Molto pericoloso.
Tulains Córdova,

Potrebbe suggerire -exec rm -rf {} +- nessun punto per la penalità prestazionale di eseguirne uno rmper file.
Charles Duffy,

2
find ./ -iname '*phpmyadmin*' -exec /usr/lib/klibc/bin/nuke {} +

Funziona anche se qualcuno crea una directory -phpmyadmin.


Trova (almeno qui) antepone i nomi ./, quindi non è necessario: rm -rf ./-phpmyadmindovrebbe essere eseguito , il che dovrebbe funzionare con qualsiasi sano di mente rm. Prova find ./ -iname '*whatever*' -exec echo '{}' ';'a testare
derobert

@derobert: l'ho fatto sbagliare in una manciata di occasioni. Non si tocca la seconda volta il ferro rovente. Forse può succedere solo se l'argomento da trovare è qualcosa come '-annoyingdirectoryname'.
Giosuè,

1
Se qualcuno correva, diciamo, find */invece find ., che lo farebbe (se un nome di directory corrispondente inizia con un trattino). Detto questo, mi piacerebbe tendo a suggerire utilizzando --per gestire questi casi, fornendo una delle opzioni di fine espliciti , prima della {}discussione. (Vedi # 10 nelle linee guida per la sintassi dell'utilità POSIX ).
Charles Duffy,

1
A parte questo, {} +è considerevolmente più efficiente di {} \;, poiché eseguirà solo tutte le istanze del tuo comando ( nukein questo caso) necessarie per adattarsi a tutti gli oggetti trovati sulla riga di comando, anziché uno per ciascuno.
Charles Duffy,

@CharlesDuffy Se avessero funzionato, find */il problema non si sarebbe verificato -exec, la directory con un trattino sembrerebbe essere findun'opzione e si lamenterebbe.
Barmar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.