Pourquoi le fichier / rm -iname '* phpmyadmin' ne supprime-t-il pas phpMyAdmin-Version-XYZ.zip?

8

J'ai ce code suivant:

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

Il supprime un répertoire appelé phpmyadmin, mais il ne supprime pas un fichier appeléphpMyAdmin-Version-XYZ.zip

Même si je supprime le -rf, il ne le supprimera toujours pas (probablement parce qu'un deuxième problème avec le -iname n'affecte pas l'insensibilité à la casse).

  1. Existe-t-il un moyen de supprimer tout inode dans un seul rm (fichier, dir, softlink)?
  2. Pourquoi l'ajout n'a-t-il -inamepas d'effet?

Remarque: je n'ai pas trouvé d'argument "supprimer tout inode" dans man rm.

derobert
la source
1
Si votre findsoutien, essayez l' -deleteaction. (Voir également gnu.org/software/findutils/manual/html_node/find_html/… pour une discussion approfondie sur les nombreuses façons de procéder incorrectement.)
zwol

Réponses:

31

Le problème est que vous faites correspondre un fichier qui se termine par phpmyadmin( sans tenir compte de la casse ) en utilisant le modèle *phpmyadmin. Pour obtenir tout fichier contenant la chaîne phpmyadmin(sans tenir compte de la casse), utilisez -iname '*phpmyadmin*':

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

Il serait peut-être judicieux d'obtenir les fichiers correspondants avant leur suppression:

find ./ -iname '*phpmyadmin*'

Pour répondre à votre première question, il n'y a pas d'option rmdans l'espace utilisateur pour traiter les inodes.

heemayl
la source
1
Il est fort possible -depthque findvous envisagiez de ne pas essayer de revenir dans un répertoire, il est simplement supprimé.
roaima
8
Pour ne rien enlever à la réponse, qui comprend cela, mais je voulais juste souligner que la commande du PO n'a pas supprimé le fichier zip parce qu'il ne l'a pas trouvé , en raison de l'absence de fin '' * 'sur le motif.
Gwyn Evans
3
@GwynEvans Cela signifie également que OP n'a pas testé le findavant d'ajouter le -execparamètre. Très dangereux.
Tulains Córdova
Pourrait suggérer -exec rm -rf {} +- aucun point à la pénalité de performance de l'exécution d'un rmpar fichier.
Charles Duffy
2
find ./ -iname '*phpmyadmin*' -exec /usr/lib/klibc/bin/nuke {} +

Cela fonctionne même si quelqu'un crée un répertoire -phpmyadmin.

Joshua
la source
Find (au moins ici) préfixe les noms ./, donc ce n'est pas nécessaire: il s'exécuterait rm -rf ./-phpmyadmin, ce qui devrait fonctionner avec n'importe quel bon sens rm. Essayez find ./ -iname '*whatever*' -exec echo '{}' ';'de tester
Derobert
@derobert: Je l'ai fait bousiller à quelques reprises. Une fois mordu, deux fois timide. Peut-être que cela ne peut se produire que si l'argument à rechercher est quelque chose comme '-annoyingdirectoryname'.
Joshua
1
Si quelqu'un s'exécutait, disons find */au lieu de find ., cela le ferait (si un nom de répertoire correspondant commençait par un tiret). Cela dit, j'aurais tendance à suggérer d'utiliser --pour gérer de tels cas en fournissant une fin d'options explicite avant l' {}argument. (Voir # 10 dans les directives de syntaxe de l'utilitaire POSIX ).
Charles Duffy
1
En aparté - {} +est considérablement plus efficace que {} \;, car il n'exécutera que autant d'instances de votre commande ( nukedans ce cas) que nécessaire pour s'adapter à tous les éléments trouvés sur la ligne de commande, par opposition à un par chacun.
Charles Duffy
@CharlesDuffy S'ils s'exécutaient, find */le problème ne se produirait pas -exec, le répertoire avec un trait d'union semblerait être une findoption et il se plaindrait.
Barmar