Warum löscht / rm -iname '* phpmyadmin' nicht phpMyAdmin-Version-XYZ.zip?

8

Ich habe folgenden Code:

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

Es löscht ein Verzeichnis namens phpmyadmin, aber es nicht löscht eine Datei namensphpMyAdmin-Version-XYZ.zip

Selbst wenn ich das entferne -rf, wird es immer noch nicht gelöscht (wahrscheinlich, weil ein zweites Problem mit dem -iname die Groß- und Kleinschreibung nicht beeinflusst).

  1. Gibt es eine Möglichkeit, einen Inode in einem einzelnen RM (Datei, Verzeichnis, Softlink) zu löschen?
  2. Warum wirkt sich das Hinzufügen -inamenicht aus?

Hinweis: Ich habe in kein Argument "Inode löschen" gefunden man rm.

derobert
quelle
1
Wenn Sie dies findunterstützen, versuchen Sie es mit der -deleteAktion. (Siehe auch gnu.org/software/findutils/manual/html_node/find_html/… für eine ausführliche Diskussion der vielen Möglichkeiten, dies falsch zu machen.)
zwol

Antworten:

31

Das Problem besteht darin, dass Sie mithilfe des Musters eine Datei abgleichen, die phpmyadmin(ohne Berücksichtigung der Groß- und Kleinschreibung ) endet *phpmyadmin. Um eine Datei, die die Zeichenfolge enthält phpmyadmin(case-insensitiv), Verwendung -iname '*phpmyadmin*':

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

Vielleicht wäre es vernünftig, die übereinstimmenden Dateien vor dem Entfernen zu erhalten:

find ./ -iname '*phpmyadmin*'

Um Ihre erste Frage zu beantworten, gibt es rmim Benutzerbereich keine Option , um mit Inodes umzugehen.

heemayl
quelle
1
Möglicherweise sollte dies berücksichtigt -depthwerden, finddamit nicht versucht wird, in ein Verzeichnis zurückzukehren, das gerade gelöscht wurde.
Roaima
8
Nicht alles , was zu nehmen von der Antwort entfernt, die diese nicht enthalten, sondern wollte nur betonen , dass der Grund , dass der Befehl des OP nicht löschen Sie die Zip - Datei war , dass es nicht finden es, aufgrund des Fehlens des hinteren ‚* 'auf dem Muster.
Gwyn Evans
3
@GwynEvans Das bedeutet auch, dass OP das findvor dem Hinzufügen des -execParameters nicht getestet hat . Sehr gefährlich.
Tulains Córdova
Könnte vorschlagen -exec rm -rf {} +- kein Grund für die Leistungsbeeinträchtigung, eine rmpro Datei auszuführen.
Charles Duffy
2
find ./ -iname '*phpmyadmin*' -exec /usr/lib/klibc/bin/nuke {} +

Dies funktioniert auch dann, wenn jemand ein -phpmyadmin-Verzeichnis erstellt.

Joshua
quelle
Finden Sie (zumindest hier) die Präfixe mit den Namen ./, so dass dies nicht erforderlich ist: Es würde ausgeführt rm -rf ./-phpmyadmin, was mit jedem vernünftigen funktionieren sollte rm. Versuchen Sie find ./ -iname '*whatever*' -exec echo '{}' ';'zu testen
derobert
@derobert: Ich habe es schon ein paar Mal vermasselt. Gebranntes Kind scheut das Feuer. Vielleicht kann es nur passieren, wenn das zu findende Argument so etwas wie '-annoyingdirectoryname' ist.
Joshua
1
Wenn jemand ran, sagt, find */statt find ., dass es tun würde (wenn ein passender Verzeichnisname mit einem Bindestrich gestartet). Trotzdem würde ich eher vorschlagen --, solche Fälle zu behandeln, indem vor dem {}Argument ein explizites Ende der Optionen angegeben wird . (Siehe Nr. 10 in den Syntaxrichtlinien des POSIX-Dienstprogramms .)
Charles Duffy
1
Nebenbei bemerkt - {} +ist erheblich effizienter als {} \;, da nur so viele Instanzen Ihres Befehls ( nukein diesem Fall) ausgeführt werden, wie für alle in der Befehlszeile gefundenen Elemente erforderlich sind, im Gegensatz zu jeweils einer.
Charles Duffy
@CharlesDuffy Wenn sie ausgeführt find */würden, würde das Problem nicht auftreten -exec. Das Verzeichnis mit einem Bindestrich scheint eine findOption zu sein, und es würde sich beschweren.
Barmar