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).
- Existe-t-il un moyen de supprimer tout inode dans un seul rm (fichier, dir, softlink)?
- Pourquoi l'ajout n'a-t-il
-iname
pas d'effet?
Remarque: je n'ai pas trouvé d'argument "supprimer tout inode" dans man rm
.
find
soutien, essayez l'-delete
action. (Voir également gnu.org/software/findutils/manual/html_node/find_html/… pour une discussion approfondie sur les nombreuses façons de procéder incorrectement.)Réponses:
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înephpmyadmin
(sans tenir compte de la casse), utilisez-iname '*phpmyadmin*'
:Il serait peut-être judicieux d'obtenir les fichiers correspondants avant leur suppression:
Pour répondre à votre première question, il n'y a pas d'option
rm
dans l'espace utilisateur pour traiter les inodes.la source
-depth
quefind
vous envisagiez de ne pas essayer de revenir dans un répertoire, il est simplement supprimé.find
avant d'ajouter le-exec
paramètre. Très dangereux.-exec rm -rf {} +
- aucun point à la pénalité de performance de l'exécution d'unrm
par fichier.Cela fonctionne même si quelqu'un crée un répertoire -phpmyadmin.
la source
./
, donc ce n'est pas nécessaire: il s'exécuteraitrm -rf ./-phpmyadmin
, ce qui devrait fonctionner avec n'importe quel bon sensrm
. Essayezfind ./ -iname '*whatever*' -exec echo '{}' ';'
de testerfind */
au lieu defind .
, 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 ).{} +
est considérablement plus efficace que{} \;
, car il n'exécutera que autant d'instances de votre commande (nuke
dans ce cas) que nécessaire pour s'adapter à tous les éléments trouvés sur la ligne de commande, par opposition à un par chacun.find */
le problème ne se produirait pas-exec
, le répertoire avec un trait d'union semblerait être unefind
option et il se plaindrait.