Pourquoi y a-t-il une différence de sortie entre l'utilisation
find . -exec ls '{}' \+
et
find . -exec ls '{}' \;
J'ai eu:
$ find . -exec ls \{\} \+
./file1 ./file2
.:
file1 file2 testdir1
./testdir1:
testdir2
./testdir1/testdir2:
$ find . -exec ls \{\} \;
file1 file2 testdir1
testdir2
./file2
./file1
+
associé à-exec
est toujours échappé, mais+
associé à-mtime
ne l'est pas. Tu connais la raison? Je suppose que c'est l'habitude de s'échapper;
associée à-exec
.;
. Je ne peux pas imaginer qu'il soit jamais nécessaire de s'échapper+
Toutes les réponses à ce jour sont correctes. Je propose cela comme une démonstration plus claire (pour moi) du comportement qui est décrit en utilisant
echo
plutôt quels
:Avec un point-virgule, la commande
echo
est appelée une fois par fichier (ou autre objet du système de fichiers) trouvé:Avec un plus, la commande
echo
n'est appelée qu'une seule fois. Chaque fichier trouvé est passé en argument.Si
find
vous obtenez un grand nombre de résultats, vous constaterez peut-être que la commande appelée étouffe le nombre d'arguments.la source
xargs
faire ... en principe, il ne s'étouffe jamais pour trop d'arguments.find
(etxargs
) sur Solaris émettre plus d'arguments que ce qui pourrait être consommé. Lesxargs
(etfind
) dans les findutils de GNU semblent se comporter de manière plus raisonnable, mais tout le monde n'utilise pas GNU.find
essaieraient d'éviter d'atteindre la limite du nombre d'arguments. Et cela inclut celui de Solaris (10 au moins). Là où cela peut échouer, c'est si vous faites quelque chose commefind ... -exec ksh -c 'cmd "$@" "$@"' sh {} +
oufind ... -exec ksh -c 'files="$*" cmd "$@"' sh {} +
, mais quefind
vous ne pouvez pas vraiment être blâmé pour cela. Notez que GNUfind
était l'une des dernièresfind
implémentations à prendre en charge+
(autrefois, il était difficile de porter un script sur les systèmes GNU).De
man find
:commande -exec;
-exec commande {} +
Donc, d'après ce que je comprends,
\;
exécute une commande distincte pour chaque fichier trouvé parfind
, tandis que\+
ajoute les fichiers et exécute une seule commande sur chacun d'eux. Le\
est un caractère d'échappement, donc c'est:contre
Faire ce qui précède dans mon shell reflétait le résultat de votre question.
exemple de quand vous voudriez utiliser
\+
Supposons deux fichiers,
1.tmp
et2.tmp
:1.tmp:
2.tmp:
Avec
\;
:Alors que si vous utilisez
\+
(pour concaténer les résultats defind
):Donc, dans ce cas, c'est la différence entre
diff 1.tmp; diff 2.tmp
etdiff 1.tmp 2.tmp
Il y a des cas où cela
\;
est approprié et\+
sera nécessaire. L'utilisation de\+
with enrm
est une, où si vous supprimez un grand nombre de fichiers, les performances (vitesse) seront supérieures à\;
.la source
find
a une syntaxe spéciale. Vous utilisez les{}
tels quels parce qu'ils ont un sens à rechercher comme chemin d'accès du fichier trouvé et (la plupart) les shells ne les interprètent pas autrement. Vous avez besoin de la barre oblique inverse\;
car le point-virgule a un sens pour le shell, qui le mange avant defind
pouvoir l'obtenir. Donc, ce quefind
veut voir APRES que le shell est fait, dans la liste d'arguments passée au programme C,mais vous avez besoin
\;
sur la ligne de commande pour obtenir un point-virgule à travers le shell pour les arguments.Vous pouvez vous en tirer
\{\}
parce que l'interprétation citée par le shell\{\}
est juste{}
. De même, vous pouvez utiliser '{}'.Ce que vous ne pouvez pas faire, c'est utiliser
parce que le shell interprète cela comme un argument,
et
rm {} ;
n'est pas le nom d'une commande. (Du moins à moins que quelqu'un ne vienne vraiment à bout.)Mettre à jour
la différence est entre
et
Le
+
catène les noms sur une ligne de commande.la source
La différence entre
;
(point-virgule) ou+
(signe plus) est la façon dont les arguments sont passés dans le paramètre-exec
/ de find-execdir
. Par exemple:using
;
exécutera plusieurs commandes (séparément pour chaque argument),Exemple:
using
+
exécutera le moins de commandes possible (car les arguments sont combinés ensemble). C'est très similaire au fonctionnement de laxargs
commande, donc elle utilisera autant d'arguments par commande que possible pour éviter de dépasser la limite maximale d'arguments par ligne.Exemple:
Voir également:
man find
la source
nous essayions de trouver un dossier pour l'entretien ménager.
trouver . -exec echo {} \; la commande a fonctionné pendant la nuit à la fin aucun résultat.
trouver . -exec echo {} \ + a des résultats et n'a pris que quelques heures.
J'espère que cela t'aides.
la source