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.


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.


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.