Vous voudrez peut-être enchaîner les appels pour trouver (une fois, lorsque vous avez appris, qu'il est possible, ce qui pourrait être le cas aujourd'hui). Ceci n’est bien entendu possible que tant que vous restez en recherche. Une fois que vous dirigez votre recherche vers xargs, c'est hors de portée.
Petit exemple, deux fichiers a.lst et b.lst:
cat a.lst
fuddel.sh
fiddel.sh
cat b.lst
fuddel.sh
Aucune astuce ici - simplement le fait que les deux contiennent "fuddel" mais un seul contient "fiddel".
Supposons que nous ne le savions pas. Nous recherchons un fichier qui correspond à 2 conditions:
find -exec grep -q fuddel {} ";" -exec grep -q fiddel {} ";" -ls
192097 4 -rw-r--r-- 1 stefan stefan 20 Jun 27 17:05 ./a.lst
Eh bien, vous connaissez peut-être la syntaxe permettant à grep ou à un autre programme de transmettre les deux chaînes en tant que condition, mais ce n'est pas la question. Tous les programmes qui peuvent renvoyer true ou false, avec un fichier comme argument, peuvent être utilisés ici - grep n'était qu'un exemple populaire.
Et notez que vous pouvez suivre find -exec avec d'autres commandes find, telles que -ls ou -delete ou quelque chose de similaire. Notez que supprimer non seulement rm (supprime les fichiers), mais également rmdir (supprime les répertoires).
Une telle chaîne est lue comme une combinaison ET de commandes, tant que cela n'est pas spécifié (à savoir avec un -or
commutateur (et des parenthèses (qui doivent être masquées))).
Donc, vous ne quittez pas la chaîne de recherche, ce qui est très pratique. Je ne vois aucun avantage à utiliser -xargs, car vous devez faire preuve de prudence lors de la transmission des fichiers, ce qui n'est pas forcément une tâche inutile - il gère automatiquement la transmission de chaque fichier en tant qu'argument unique.
Si vous pensez avoir besoin d'un masque pour les accolades , n'hésitez pas à consulter ma question qui demande des preuves. Mon affirmation est la suivante: vous ne le faites pas.
find
. Merci beaucoup!-exec
fairexargs -P4
pour que trois des quatre cœurs ne restent pas inactifs?Sécuriser les noms de fichiers à
xargs
nécessite que votre option soit prise en charge et que vousfind
disposiez de l’-print0
optionxargs
correspondante pour la lire (--null
ou-0
). Sinon, les noms de fichiers contenant des caractères non imprimables, des barres obliques inverses, des guillemets ou des espaces peuvent provoquer un comportement inattendu. Par contre, ilfind -exec {} +
est conforme à lafind
spécification POSIX , il est donc portable et il est à peu près aussi sûrfind -print0 | xargs -0
et certainement plus sûr quefind | xargs
. Je recommanderais de ne jamais fairefind | xargs
sans-print0
.la source
find … -exec … {} +
OpenBSD est une exception notable à la portabilité , qui n’a acquis cette fonctionnalité qu’avec la version 5.1 publiée en 2012. Tous les BSD ont-print0
depuis plusieurs années, même OpenBSD (bien qu’il ait résisté à cette fonctionnalité pendant un certain temps également). Solaris, quant à lui, reste fidèle aux fonctionnalités POSIX, donc vous obtenez-exec +
et non-print0
.-print0
C'est une douleur et bien que vous puissiez dire que cexargs --delimiter "\n"
n'est pas équivalent, je n'ai jamais utilisé le premier après avoir découvert le dernier.-0
c'est plus pénible que--delimiter "\n"
.-0
, GNUxargs
doit-r
éviter d’exécuter la commande s’il n’ya pas d’entrée.| xargs -r0 cmd
est quecmd
le stdin est affecté (en fonction de laxargs
mise en œuvre, de son fonctionnement/dev/null
ou de la conduite).Si vous utilisez le
-exec ... ;
formulaire (en vous rappelant d'échapper au point-virgule), vous exécutez la commande une fois par nom de fichier. Si vous utilisez-print0 | xargs -0
, vous exécutez plusieurs commandes par nom de fichier. Vous devez absolument utiliser le-exec +
formulaire, qui place plusieurs fichiers dans une seule ligne de commande et est beaucoup plus rapide lorsqu'un grand nombre de fichiers est impliqué.Un gros plus de l'utilisation
xargs
est la possibilité d'exécuter plusieurs commandes en parallèle à l'aidexargs -P
. Sur les systèmes multicœurs, cela peut permettre de gagner beaucoup de temps.la source
-P
au lieu de-p
. N'oubliez pas que cexargs -P
n'est pas dans le standard POSIXfind -exec {} +
, ce qui est important si vous optez pour la portabilité.find /tmp/ -exec ls "{}" +
fonctionne très bien.-exec
depuis si longtemps (je suis masochiste, je n'utilise même pas de guillemets pour m'échapper{}
, je tape toujours\{\}
; ne demandez pas), on dirait que tout doit être échappé maintenant.find /tmp/ -exec ls {} +
cela ne fonctionnerait pas.bash
commencé à accepter les orthèses textuellement. Je suis à peu près sûr qu'au moins un des vieux coquillages que j'ai utilisés a jeté une crise si les bretelles n'étaient pas échappées.En ce qui concerne les performances, j’ai pensé que ce
-exec … +
serait tout simplement préférable, car c’est un outil unique qui fait tout le travail, mais une partie de la documentation de GNU findutil indique que cela-exec … +
pourrait être moins efficace dans certains cas:Je ne savais pas trop ce que cela voulait dire, alors j'ai demandé dans le chat où Derobert l' expliquait ainsi:
(Formatage par moi.)
Donc, il y a ça. Mais si les performances importent vraiment, vous devrez procéder à des analyses comparatives réalistes ou plutôt vous demander même si vous souhaitez même utiliser shell pour de tels cas.
Ici, sur ce site, je pense qu'il est préférable de conseiller aux gens d'utiliser le
-exec … +
formulaire chaque fois que possible, simplement parce que c'est plus simple et pour les raisons mentionnées dans les autres réponses ici (par exemple, gérer des noms de fichiers étranges sans trop réfléchir).la source