D'après ce que je comprends, ce qui suit devrait signifier exactement la même chose:
ls -1 | xargs file {}
ls -1 | xargs -I{} file {}
Si l'option -I n'est pas spécifiée, sa valeur par défaut est -I {}.
Je veux lister tous les fichiers du répertoire courant et lancer file
commande sur chacun d'eux. Certains ont des espaces dans leurs noms. Cependant, j'ai remarqué la différence. Voir ci-dessous:
$ ls -1
Hello World
$ ls -1 | xargs file {}
{}: ERROR: cannot open `{}' (No such file or directory)
Hello: ERROR: cannot open `Hello' (No such file or directory)
World: ERROR: cannot open `World' (No such file or directory)
$ ls -1 | xargs -I{} file {}
Hello World: directory
Si -I {} est explicitement spécifié, les espaces dans les noms de fichiers sont traités comme prévu.
xargs file
ouxargs -I{} file {}
. Ne devrait pas êtrexargs file {}
. Je suppose que quand spécifiant explicitement -I {}, le bash le traitera commefile "Hello World"
. Sans -I {}, il est traité commefile Hello World
.-1
option dels
, mais il est activé par défaut lorsque la sortie dels
est un fichier ou une pipe, vous n’en avez donc pas besoin ici. (3) Vous confondez-I
avec les obsolètes-i
(minusculeI
) option.-ifoo
est équivalent à-Ifoo
, mais simple-i
est équivalent à-I{}
. Mais utiliser-I{}
. (4) Si vous voulez vraiment faire ce que vous dites vouloir, pourquoi ne pas simplement direfile *
?file
sur eux. Mais je suis venu avec un exemple plus simple en utilisantls
. Tu as raison. Pour ça,file *
est le meilleur.-exec
.Réponses:
le
-I
nécessite un espace réservé défini. le-i
l'option assumera{}
est l'espace réservé. C’est là que j’ai trouvé une hypothèse de {} dansman xargs
au moins sur Cygwin et CentOS.xargs appelé sans l'une ou l'autre des options n'a pas besoin d'espace réservé et ajoute simplement le STDIN à la fin des arguments.
Il suffit d'ajouter
echo
à vos exemples pour voir ce que fait xargs:Votre exemple utilise par erreur
{}
:alors le
file
cmd voit des arguments de{} Hello World
et des erreurs.Si vous voulez utiliser explicitement
{}
dans votre appel xargs:Ou sans espace réservé:
xargs comme appelé ci-dessus n'a pas besoin de {}. Il ajoute le STDIN à la fin de la commande sans espace réservé. L'utilisation de {} signifie généralement que vous voulez que le STDIN quelque part au milieu de la commande s'exécute, comme dans
la source