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

  • Je vois. Jai ' également lu que lutilisation du commutateur -delete avant -name supprime larborescence de fichiers spécifiée , donc je suppose que je dois être prudent.
  • Sur find récent, vous pouvez utiliser -exec rm {} + pour supprimer tout ce qui correspond fichiers avec une seule commande rm.
  • .DS_Store ne ' t contiennent des caractères spéciaux, donc les guillemets sont inutiles et ne changent rien dans ce cas.
  • En gros, seuls les espaces (espaces, tabulations, peut-être dautres) sont la seule chose qui fait quune chaîne non entre guillemets soit interprétée comme deux arguments de ligne de commande séparés, mais que ' nest pas tout ce dont vous devez vous excuser lorsque vous décidez de citer ou non. Vous devez vous soucier de tous les métacaractères du shell comme ; ou | ou > ou < et «  et bien dautres qui ont une signification particulière pour le shell sauf sils sont cités.
  • @MarcoMarsala 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.

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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *