Jessaie de comprendre la différence entre ces deux commandes:
sudo find / -name .DS_Store -delete
et
sudo find / -name ".DS_Store" -exec rm {} \;
Jai remarqué que le -exec ... {}
est préférable. Pourquoi? Laquelle est la plus sûre / la plus rapide / la meilleure? Jai utilisé les deux sur mon Macbook et tout semble bien fonctionner.
Answer
-delete
fonctionnera mieux car il n « » pas besoin de générer un processus externe pour chaque et tous les fichiers correspondants.
Il est possible que vous voyiez -exec rm {} \;
souvent recommandé car -delete
nexiste pas dans toutes les versions de find
. Je ne peux « pas vérifier pour le moment, mais je » suis presque sûr davoir « utilisé un find
sans lui.
B Les deux méthodes doivent être « sûres ».
EDIT par commentaire de @doitmyway: assurez-vous que vous correspondez sur le nom et puis supprimer, pas linverse (supprimer, puis faire correspondre). Sinon chaque fichier sera supprimé, quil corresponde ou non . Par exemple, NE faites ceci: find / -delete -name .DS_Store
.
Une méthode courante pour éviter la surcharge liée à la création dun processus externe pour chaque fichier correspondant est:
find / -name .DS_Store -print0 | xargs -0 rm
(mais notez quil y a un problème de portabilité ici aussi: toutes les versions de find nont pas -print0
!)
Commentaires
Réponse
En supposant que .DS_Store
représente 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
utilisée pour demander la recherche GNU et nest toujours pas standard dans de nombreuses autres implémentations find
, elle nest donc pas toujours disponible.
La fin de la commande +
dans au lieu de \;
optimise fortement la clause exec
en nexécutant pas la commande rm
pour chacun et chaque .DS_Store
présent sur le système de fichiers.
Réponse
Pour une telle machine comme 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 -supprimer ». Cependant, cette recherche peut renvoyer des faux positifs indésirables. Lorsque vous faites quelque chose avec sudo, vous devriez être un peu plus prudent. Lavantage dutiliser -exec rm {} est que vous pouvez passer des arguments à rm comme ceci:
sudo find / -iname "*~" -exec rm -i {} \;
Dans cet exemple, je veux supprimer les fichiers de sauvegarde qui emacs fait. Cependant, ce tilde pourrait être dans un fichier obscur que je ne connais pas et qui pourrait être important. De plus, je veux confirmer la suppression. Jai donc mis loption « -i » sur la commande rm. Cela me donnera une suppression interactive .
Vous pouvez également affiner lutilisation de rm pour supprimer des répertoires ainsi que des fichiers:
find /usr/local/share/ -iname "useless" -exec rm -r {} \;
En bref, le -exec donne vous avez un peu plus de contrôle sur la commande réelle qui supprime lélément trouvé. Lavantage est que vous utilisez un outil pour trouver les fichiers, un autre outil pour les supprimer.De plus, toutes les versions de lutilitaire de recherche ne disposent pas de loption -delete. Il vaut donc mieux utiliser chaque outil pour son bon travail. Cest la philosophie Unix – un outil, un travail, utilisez-les ensemble pour faire ce que vous devez faire.
Commentaires
- Voir aussi
-ok rm {} \;
à la place de-exec rm {} \;
pour confirmation interactive.
-delete
avant-name
supprime larborescence de fichiers spécifiée , donc je suppose que je dois être prudent.find
récent, vous pouvez utiliser-exec rm {} +
pour supprimer tout ce qui correspond fichiers avec une seule commanderm
..DS_Store
ne ' t contiennent des caractères spéciaux, donc les guillemets sont inutiles et ne changent rien dans ce cas.;
ou|
ou>
ou<
et « et bien dautres qui ont une signification particulière pour le shell sauf sils sont cités.xargs
prend en charge le problème de la liste darguments de taille limitée de manière transparente en le décomposant en plusieurs appels de la commande.