La différence réside dans les données acceptées par le programme cible.
Si vous utilisez uniquement un canal, il reçoit des données sur STDIN (le flux d'entrée standard) sous forme de pile de données brutes qu'il peut trier sur une ligne à la fois. Cependant, certains programmes n'acceptent pas leurs commandes en standard, ils s'attendent à ce que cela soit précisé dans les arguments de la commande. Par exemple touch
prend un nom de fichier en tant que paramètre sur la ligne de commande comme ceci: touch file1.txt
.
Si vous avez un programme qui génère des noms de fichiers sur la sortie standard et que vous voulez les utiliser comme arguments pour touch
, vous devez utiliser xargs
qui lit les données de flux stdin et convertit chaque ligne dans l' espace arguments séparés à la commande.
Ces deux choses sont équivalentes:
# touch file1.txt
# echo file1.txt | xargs touch
Ne pas utiliser xargs
sauf si vous savez exactement ce que vous faites et pourquoi vous en avez besoin. Il est souvent fréquent qu'il existe un meilleur moyen de faire le travail que xargs
de forcer la conversion. Le processus de conversion est également semé d'embûches potentielles telles que la fuite, l'expansion des mots, etc.
xargs
et$(...)
), xargs est beaucoup plus sûr que la substitution de commande. Et je ne me souviens pas avoir jamais rencontré un nom de fichier légitime contenant une nouvelle ligne. Les problèmes liés aux échappements et à l’expansion des mots liés à la substitution de commande ne sont-ils pas xargs?xargs -0
), ce qui est utile avecfind -print0
.xargs
- t -il le programme via le shell avec des arguments séparés par des espaces, ou construit-il réellement la liste des arguments en interne (par exemple pour une utilisation avecexecv
/execp
)?-d \n
, bien que les xargs BSD (OSX et autres) ne semblent pas prendre en charge cette option.Pour compléter les réponses déjà fournies, vous
xargs
pouvez réaliser une chose intéressante qui devient de plus en plus importante dans le paysage informatique multicœur et distribué de nos jours: il est possible de traiter en parallèle des travaux.Par exemple:
va encoder * .wav => * .flac, en utilisant trois processus à la fois (
-P 3
).la source
-exec
paramètre ne traitera pas les tâches en parallèle.-0
argument pour lexargs
faire considère que leNULL
caractère est le délimiteur d'élément d'entrée.find -print0
sortie des éléments délimités par NULL. C'est une bonne pratique pour les noms de fichiers pouvant contenir des espaces, des guillemets ou d'autres caractères spéciaux.xargs est particulièrement utile lorsque vous avez une liste de chemins de fichiers sur stdin et que vous voulez faire quelque chose avec eux. Par exemple:
Examinons cette étape par étape:
En d’autres termes, notre entrée est une liste de chemins vers lesquels nous voulons faire quelque chose.
Pour savoir ce que fait xargs avec ces chemins, une bonne astuce consiste à ajouter
echo
avant votre commande, comme suit:L'
-n 1
argument fera en sorte que xargs transforme chaque ligne en une commande qui lui est propre. Lased -i "s/color/colour/g"
commande remplacera toutes les occurrences decolor
withcolour
pour le fichier spécifié.Notez que cela ne fonctionne que s'il n'y a pas d'espaces dans vos chemins. Si vous le faites, vous devez utiliser des chemins nuls comme terminaison comme entrée de xargs en transmettant l'
-0
indicateur. Un exemple d'utilisation serait:Ce qui fait la même chose que ce que nous avons décrit ci-dessus, mais fonctionne également si l'un des chemins contient un espace.
Cela fonctionne avec n'importe quelle commande produisant des noms de fichiers en sortie tels que
find
oulocate
. Si vous l'utilisez dans un dépôt git avec beaucoup de fichiers, il peut être plus efficace de l'utiliser avecgit grep -l
au lieu degit ls-files
, comme ceci:La
git grep -l "color" "*.tex"
commande donnera une liste de fichiers "* .tex" contenant la phrase "couleur".la source
Votre premier argument illustre assez bien la différence.
\ls | grep Cases | less
vous permet de parcourir la liste des noms de fichiers produits parls
etgrep
. Peu importe qu’il s’agisse de noms de fichiers, c’est juste du texte.\ls | grep Cases | xargs less
vous permet de parcourir les fichiers dont les noms sont générés par la première partie de la commande.xargs
prend une liste de noms de fichiers en entrée et une commande sur sa ligne de commande et exécute la commande avec les noms de fichiers sur sa ligne de commande.Lors de l' examen à l' aide
xargs
, garder à l' esprit qu'il attend une entrée en forme d'une manière étrange: délimité par des espaces, avec\
,'
et"
utilisé pour citer (d'une manière inhabituelle, parce que\
n'est pas des citations spéciales à l' intérieur). Utilisez uniquementxargs
si vos noms de fichiers ne contiennent pas d’espace ni de\'"
.la source
xargs
a l'-0, --null
option de contourner le problème des espaces (c'est fort probable que je l'ai appris de vous :), alors je suppose que vous parlez d'unxarg
appel sans options , mais je suis perplexe devant votre référence aux citations. Avez-vous un lien ou un exemple à ce sujet? .. (ps.| xargs less
est un "truc" très pratique +1 .. merci ..Dans votre exemple, vous n'avez pas besoin de l'utiliser
xargs
car vousfind
ferez exactement et en toute sécurité ce que vous voulez faire.Exactement ce que vous voulez utiliser,
find
c'est:Dans cet exemple, cela
-maxdepth 1
signifie que vous recherchez uniquement dans le répertoire en cours, ne descendez dans aucun sous-répertoire; Par défaut, find cherchera dans tous les sous-répertoires (ce qui est souvent ce que vous voulez), sauf si vous le contraignez avec maxdepth. Le{}
est le nom du fichier qui sera remplacé à la place et le+
est l'un des deux marqueurs de fin de commande, l'autre étant;
. La différence entre eux est que;
signifie exécuter la commande sur chaque fichier un à la fois, alors que+
signifie exécuter la commande sur tous les fichiers à la fois. Notez cependant que votre shell va probablement essayer de s’interpréter;
lui-même, vous devrez donc y échapper avec\;
ou';'
. Oui,find
a un certain nombre de petits ennuis comme celui-ci, mais sa puissance compense largement.Les deux
find
etxargs
sont difficiles à apprendre au début. Pour vous aider à apprendre,xargs
essayez d’utiliser l’ option-p
ou--interactive
qui vous montrera la commande qu’elle est sur le point d’exécuter et vous demande si vous souhaitez ou non l’exécuter.De même,
find
vous pouvez utiliser-ok
à la place de-exec
pour vous demander si vous souhaitez ou non exécuter la commande.Il
find
arrive cependant que, dans certains cas, vous ne puissiez pas faire tout ce que vous voulez et que ce soit le casxargs
. La-exec
commande n'acceptera qu'une seule occurrence d'{}
apparition, donc si vous obtenez une erreurfind -type f -exec cp {} {}.bak \;
, vous pouvez le faire comme suit. :find -type f -print0 | xargs -0 -l1 -IX cp X X.bak
Vous pouvez en apprendre plus sur les commandes d’ exécution dans le manuel GNU Findutils .
De plus, j'ai mentionné que
find
vous faites ce que vous voulez en toute sécurité, car lorsque vous traitez avec des fichiers, vous allez rencontrer des espaces et d'autres caractères qui poseront problème,xargs
sauf si vous utilisez l' option-0
ou--null
avec quelque chose qui génère des éléments de saisie terminés par un caractère nul. des espaces.la source
'
ou"
peuvent être problématiques, alors quefind
ces cas seront traités sans problème.xargs
(avecfind
,sort
,du
,uniq
,perl
et quelques autres) accepte un commutateur de ligne de commande pour dire « STDIN a une liste de fichiers, séparés par un octet NUL (0x00) ». Cela facilite la gestion des noms de fichiers contenant des espaces et d’autres personnages amusants. Les noms de fichiers ne contiennent pas de NUL.la source