tl; dr: -delete
n’est pas requis par POSIX, -exec
c’est.
Faits
Page de manuel POSIX 1003.1 pourfind
spécifie -exec
mais pas -delete
.
Cela signifie -exec
devrait fonctionner pratiquement partout. Je serais surpris de constater find
que cela a -delete
sans -exec
. Le contraire est tout à fait possible. Les systèmes particulièrement légers qui utilisent busybox
tendent à fournir uniquement des options de base en ligne de commande.
Par exemple, j'ai un OpenWRT sur l'un de mes routeurs et il find
comprend -exec
, il ne comprend pas -delete
.
Ne pas avoir -delete
n'est pas un gros problème quand vous avez -exec rm …
. D'autre part -delete
ne peuvent pas remplacer -exec
en général. C'est une conception judicieuse pour permettre l'omission en -delete
premier.
Expérience personnelle, observations et opinions
Ce qui précède devrait être la principale raison pour laquelle il -exec rm {} \;
est si largement recommandé. Le secondaire peut être un effet boule de neige. Les utilisateurs lisent des articles et des exemples, se familiarisent avec -exec
et publient leurs propres commandes (par exemple, ici sur Super User). Certains d'entre eux peuvent même ne pas savoir -delete
existe.
Quelques fois j'ai vu (ou donné) des remarques telles que "Vous pouvez utiliser à la -delete
place". Et les réponses étaient comme "Merci, je ne le savais pas". Je ne me souviens d'aucune réponse "Je sais, mais ce n'est pas POSIX".
Cela dit, j'ai tendance à mentionner -delete
chaque fois que cela -exec rm {} \;
apparaît. La raison en est -delete
que ne crée pas un nouveau processus, alors qu'il -exec rm {} \;
appelle un distinct rm
pour chaque fichier correspondant. Si vous ne pouvez pas utiliser, -delete
alors votre prochaine pensée devrait être de -exec rm {} +
pouvoir supprimer plusieurs fichiers avec un seul rm
(même s'il en aura rm
besoin plus d'une fois).
Pourquoi n'est-il pas -exec … +
largement recommandé alors? C'est peut-être à cause de ses limites. Je peux imaginer un utilisateur inexpérimenté pensant "Cela fonctionne avec rm
, laissez-moi l'utiliser avec mv
!" Alors -exec mv {} foo/ +
ne fonctionne pas car il {}
faut être à la fin, juste avant +
. L'utilisateur est frustré et retourne à maman Windows.
La recommandation -delete
est généralement sans danger ici sur Super User, je pense. La plupart des questions spécifient de "gros" systèmes d'exploitation, les find
commandes sont riches en options. Et même s'il y a un utilisateur dont le nombre find
est limité, j'aurai probablement des retours. Il ou elle dit que la solution ne fonctionne pas pour eux et je suggère -exec rm …
plutôt, expliquer le problème, etc.
Un article autonome qui recommande de -delete
ne pas obtenir de tels commentaires. En cas de problème, un utilisateur accédera simplement au lien suivant renvoyé par Google.
La différence réside dans la flexibilité. Si vous utilisez -exec, vous exécutez une commande pour chaque fichier sélectionné. Si vous utilisez -exec, vous avez la possibilité d'appliquer d'autres options de recherche. Avec -delete, l’utilisation de -prune est restreinte. De plus, votre placement de -delete affecte vos résultats. Voir l'extrait de documentation ci-dessous:
la source
L'ancienne forme "largement recommandée", toujours préférée sur les systèmes sans
-delete
, est (en remplaçant les ellipses selon les cas):Cela limite les processus à deux au lieu de
-exec
générer potentiellement des milliers, tout en gérant correctement les noms de fichiers avec des caractères spéciaux (alors que l'utilisation de -print0 et l'omission de -0 dans xargs permettraient de scinder les noms de fichiers de manière erronée).Il utilise un processus de plus que
find
avec-delete
et présente une surcharge de communication entre processus, mais il est, comme avec-delete
beaucoup plus rapide quefind ... -exec /bin/rm '{}' \'
dans presque tous les cas.la source
-exec rm {} \;
largement recommandé?" Votre code est sain, votre explication est correcte; mais ce n'est qu'une digression, un commentaire sur une autre façon de faire la même chose. La question ne mentionne pasxargs
ni ne demande des alternatives à-delete
. C'est la deuxième fois que je prétends qu'une de vos réponses ne répond pas à la question. Vous venez d’améliorer votre réponse et de me convaincre que cela répond à la question. S'il vous plaît me convaincre ici aussi.-exec rm
n'est pas recommandé sur de nombreux systèmes, pour les raisons que j'ai données - manque de support ou volonté de limiter le nombre de processus. "largement recommandé" ne signifie pas idéal dans toutes les circonstances, et ne pas répondre à cette hypothèse semble irresponsable. Les autres réponses fournissaient déjà des détails utiles pour la question exacte; une simple reformulation du matériau cohérent n’ajoute rien. Ce que j'ai donné est complémentaire mais pertinent. Je ne suis pas ici pour remplacer les contributions à la réponse, et parfaitement bien si quelqu'un d'autre les incorpore dans une réponse autonome. N'hésitez pas à le faire vous-même.