web-dev-qa-db-fra.com

trouver - exec rm vs -delete

J'essaie de comprendre la différence entre ces deux commandes:

Sudo find / -name .DS_Store -delete

et

Sudo find / -name ".DS_Store"  -exec rm {} \;

J'ai remarqué que la méthode exec est préférée. Pourquoi? Lequel est le plus sûr/le plus rapide/le meilleur? J'ai utilisé les deux sur mon Macbook et tout semble bien fonctionner.

295
Onion

-delete fonctionnera mieux car il n'a pas à générer un processus externe pour chaque fichier correspondant.

Il est possible que vous voyiez -exec rm {} \; souvent recommandé car -delete n'existe pas dans toutes les versions de find. Je ne peux pas vérifier pour le moment mais je suis presque sûr d'avoir utilisé un find sans lui.

Les deux méthodes doivent être "sûres".

ÉDITEZ par commentaire de @doitmyway: assurez-vous de faire correspondre le nom et puis supprimer, pas l'inverse (supprimer, puis faire correspondre). Sinon chaque fichier sera supprimé, qu'il corresponde ou non . C'est-à-dire, NE PAS faites ceci: find / -delete -name .DS_Store.

Une méthode courante pour éviter la surcharge de création d'un processus externe pour chaque fichier correspondant est la suivante:

find / -name .DS_Store -print0 | xargs -0 rm

(mais notez qu'il y a un problème de portabilité ici aussi: toutes les versions de find n'ont pas -print0!)

280
Celada

En supposant .DS_Store représentent des fichiers et non des répertoires, le moyen le plus portable et le plus rapide de le faire serait:

Sudo find / -name .DS_Store -exec rm {} +

Le seul risque est que Sudo ne soit pas disponible mais il est assez faible de nos jours.

Le -delete option utilisée pour demander GNU find et n'est toujours pas standard dans de nombreuses autres implémentations find, elle n'est donc pas toujours disponible.

La terminaison de la commande + au lieu de \; optimise fortement la clause exec en n'exécutant pas la commande rm pour chaque .DS_Store présent sur le système de fichiers.

30
jlliagre

Pour une machine telle que votre macbook, vous ne trouverez pas beaucoup de différence de performances entre les deux commandes. Cependant, si vous regardez la version -exec, vous pouvez voir une différence subtile:

Sudo find / -iname ".file-to-delete"  -exec rm {} \;

Cela signifie que vous trouverez tous ces fichiers avec le nom ".file-to-delete". Cependant, cette recherche peut renvoyer des faux positifs indésirables. Lorsque vous faites quelque chose avec Sudo, vous devez être un peu plus prudent. L'avantage d'utiliser -exec rm {} est que vous pouvez passer des arguments à rm comme ceci:

Sudo find / -iname "*~"  -exec rm -i {} \;

Dans cet exemple, je souhaite supprimer les fichiers de sauvegarde créés par emacs. Cependant, ce tilde pourrait être dans un fichier obscur que je ne connais pas et pourrait être important. De plus, je veux confirmer la suppression. J'ai donc mis l'option '-i' sur la commande rm. Cela me donnera une suppression interactive.

Vous pouvez également affiner l'utilisation de rm pour supprimer des répertoires ainsi que des fichiers:

find /usr/local/share/ -iname "useless" -exec rm -r {} \;

En bref, -exec vous donne un peu plus de contrôle sur la commande réelle qui supprime l'élément trouvé. L'avantage est que vous utilisez un outil pour rechercher les fichiers, un autre outil pour les supprimer. De plus, toutes les versions de l'utilitaire find n'ont pas l'option -delete. Il vaut donc mieux utiliser chaque outil pour son bon travail. Telle est la philosophie Unix - un outil, un travail, utilisez-les ensemble pour faire ce que vous devez faire.

17
Fr. John Jenkins