Une différence est que lorsque vous utilisez la substitution de commandes au lieu d'un canal, la taille des données transmises est limitée par la taille du tampon de commande, elle est donc tronquée dans certains cas sans avertissement. Cela signifie également que toute la sortie de la commande doit être produite et stockée en mémoire avant d'être passée à la commande suivante, donc pour les grandes sorties, vous pouvez utiliser beaucoup plus de mémoire que nécessaire.
Un autre problème avec la première méthode est que la sortie est divisée en espaces blancs, vous ne pouvez donc pas gérer les noms de fichiers contenant des espaces. xargs
est également affecté par le problème des espaces, mais il peut être résolu en modifiant le délimiteur utilisé. Pour gérer correctement les noms de fichiers, vous devez utiliser l'octet nul comme délimiteur dans le deuxième exemple.
Un troisième problème est que les globes sont développés, donc si un fichier a des astérisques ou des points d'interrogation dans son nom, il y aura des résultats inattendus.
Vous pouvez trouver une discussion intéressante sur le problème ici: http://mywiki.wooledge.org/ParsingLs
La syntaxe correcte serait
echo rm *
ou si vous devez utiliser xargs,
find . -maxdepth 1 -print0 | xargs -0 echo rm
Supprimer echo
lorsque la sortie semble correcte.
xargs
s'exécute également dans un sous-shell en raison du canal, sauf si vous l'activezshopt -s lastpipe
, auquel cas il s'exécutera dans le shell actuel. Je ne pense pas que l'exécution en sous-shell soit un problème dans ce cas, car vous ne modifiez aucune variable.-l
drapeau, commefind . -maxdepth 1 -print0 | xargs -0 -l rm
. Pour la deuxième question, vous ne pouvez pas utiliserls
avecxargs -0
car ls ne divise pas la sortie sur le bute nul, mais avec des sauts de ligne (qui sont valides dans les noms de fichiers BTW)-0
option souffre du problème des espaces blancs.man xargs
, utiliserecho
pour les tests, nonrm
.xargs
nous permet de dépasser les limites du shell (certains tampons sont limités à 65 Ko, une liste de noms de fichiers ne l'est pas).xargs --show-limits
et vous verrez la limite qui est définie sur votre système,