xargs - Construire et exécuter des lignes de commandes à partir de
l'entrée standard
xargs [
options] [
commande
[
paramètres_initiaux]]
Cette page de manuel documente la version GNU de
xargs.
xargs lit
des éléments délimités par des blancs (pouvant
être protégés par des apostrophes, des guillemets ou une
contre-oblique) ou par des sauts de ligne depuis l'entrée standard, et
exécute une ou plusieurs fois la
commande (
echo par
défaut) en utilisant les
paramètres_initiaux suivis des
paramètres lus depuis l'entrée standard. Les lignes blanches en
entrée sont ignorées.
La ligne de commande pour
commande est construite jusqu'à ce
qu'elle atteigne une limite définie par le système (sauf si les
options
-n et
-L sont utilisées). La
commande
spécifiée est invoquée autant de fois que
nécessaire pour épuiser la liste d'objets en entrée. En
général, il y aura beaucoup moins d'invocations qu'il y a
d'objets en entrée. Certaines commandes peuvent, de façon utile,
être aussi exécutées en parallèle ; voir
l'option
-P.
Parce que les noms de fichiers Unix peuvent comporter des blancs et des
caractères de saut de ligne, ce comportement par défaut pose
souvent des problèmes ; les noms de fichiers qui comportent des
blancs et/ou des caractères de saut de ligne sont traités de
manière incorrecte par
xargs. Dans ces situations, il est
préférable d'utiliser l'option
-0 qui permet
d'éviter ce genre de problèmes. Lorsque cette option est
utilisée, il faut s'assurer que le programme qui produit
l'entrée pour
xargs utilise aussi un octet NULL comme
séparateur. Si ce programme est GNU
find par exemple, l'option
-print0 le fera pour vous.
Si l'appel de la commande se termine avec un code d'état 255,
xargs s'arrêtera immédiatement sans lire davantage les
paramètres d'entrée. Si cela se produit, un message d'erreur est
émis vers la sortie d'erreur standard (stderr).
- -0, --null
- Les noms des fichiers d'entrée sont terminés
par un octet NULL au lieu d'un espace, et les apostrophes, guillemets et
contre-obliques n'ont pas de signification particulière (chaque
caractère est utilisé littéralement).
Désactive la chaîne de fin de fichier, qui est
traitée comme tout autre paramètre. Utile quand des
arguments sont susceptibles de contenir des espaces, des marques de
protection ou des contre-obliques. L'option - print0 de GNU
find produit une sortie convenant à ce mode.
-
-a fichier,
--arg-file=fichier
- Lire les données depuis fichier plutôt
que depuis l'entrée standard (stdin). Si vous utilisez cette
option, stdin restera inchangée lors de l'exécution de la
commande. Sinon, stdin est redirigée depuis /dev/null.
-
--delimiter=délimiteur, -d
délimiteur
- Les objets en entrée sont terminés par le
caractère spécifié. Le délimiteur
spécifié peut être un caractère simple, un
caractère d'échappement dans le style de C tel que
\n ou un code d'échappement en octal ou en
hexadécimal, avec la même acception que pour la commande
printf. Les caractères multi-octets ne sont pas
acceptés. Lors du traitement de l'entrée, les guillemets et
les contre-obliques ne sont pas des caractères
spéciaux ; tous les caractères de l'entrée
sont considérés littéralement. L'option -d
désactive toute chaîne de fin de fichier qui est
traitée comme n'importe quel autre paramètre. Cette option
peut être utilisée quand l'entrée consiste simplement
en des objets séparés par des sauts de ligne, bien qu'il
soit presque toujours meilleur de concevoir le programme pour qu'il
utilise l'option --null lorsque c'est possible.
-
-E chaîne-fin-de-fichier
- Définir la chaîne de fin de fichier à
chaîne-fin-de-fichier. Si la chaîne de fin de fichier
se trouve dans une ligne d'entrée, le reste de l'entrée est
ignoré. Si on n'utilise ni -E ni -e, on n'utilise
aucune chaîne de fin de fichier.
-
-e[chaîne-fin-de-fichier],
--eof[ =chaîne-fin-de-fichier]
- Cette option est un synonyme de l'option -E.
Utiliser de préférence -E parce qu'elle est conforme
à la norme POSIX alors que cette option ne l'est pas. Si
chaîne-fin-de-fichier est omis, il n'existe pas de
chaîne de fin de fichier. Si aucune des options -E et
-e n'est utilisée, aucune chaîne de fin de fichier
n'est utilisée.
-
-I chaîne-remplacement
- Remplacer les occurrences de
chaîne-remplacement dans les paramètres initiaux par
les noms lus sur l'entrée standard. Dans ce cas, les blancs non
protégés ne sont pas considérés comme
terminant les items en entrée. Le séparateur est le
caractère de nouvelle ligne. Implique -x et
-L 1.
-
-i[chaîne-remplacement],
--replace[ =chaîne-remplacement]
- Cette option est un synonyme de
-Ichaîne-remplacement si
chaîne-remplacement est indiquée et de -I{}.
Si l’argument chaîne-remplacement est absent, le
résultat est le même que -I{}. Cette option est
obsolète ; veuillez utiliser -I à la
place.
-
-L nombre_max_lignes
- Utiliser au plus nombre-max-lignes lignes non vides
par ligne de commande. Des blancs en fin de ligne permettent à une
ligne de se poursuivre logiquement sur la ligne suivante. Implique
-x.
-
-l [nombre_max_lignes],
--max-lines[=nombre_max_lignes]
- Synonyme de l'option -L. À l'inverse de
-L, le paramètre nombre-max-lignes est optionnel. Le
paramètre nombre-max-lignes vaut 1 par défaut
s'il n'est pas indiqué. L'option -l est obsolète
depuis qu'elle a été remplacée par -L dans la
norme POSIX.
-
-n nombre-max-param,
--max-args=nombre-max-param
- Utiliser au plus nombre-max-param paramètres
par ligne de commande. Un nombre de paramètres inférieur
à nombre-max-param sera utilisé si la taille
(consultez l'option -s) est dépassée, à moins
que l'option -x ne soit indiquée, auquel cas xargs se
terminera.
-
-P nombre-max-procs,
--max-procs=nombre-max-procs
- Exécuter jusqu'à nombre-max-procs
processus à la fois ; par défaut, c'est 1. Si
le nombre-max-procs est 0, xargs exécutera
à la fois autant de processus que possible. Utiliser l'option
-n ou l'option -L avec -P ; autrement il y a
un risque que seule une exécution soit réalisée.
Pendant l'exécution de xargs, il est possible d'envoyer
à son processus un signal SIGUSR1 pour augmenter le nombre des
commandes à exécuter simultanément ou un signal
SIGUSR2 pour diminuer ce nombre. Il n'est pas possible d'augmenter ce
nombre au-delà de la limite définie par
l'implémentation (qui est affichée avec l'option
--show-limits). Il n'est pas possible de l'abaisser au-dessous de
1. xargs ne met jamais fin à ses commandes ;
quand une diminution est demandée, il attend seulement que plus
d'une commande existante s'achève avant d'en lancer une autre.
Veuillez noter qu'il revient aux processus appelés de
gérer correctement les accès parallèles aux
ressources partagées. Par exemple, si plus d'un processus essaye
d'afficher sur la sortie standard, les sorties seront produites dans un
ordre indéterminé (et vraisemblablement
mélangées) à moins que les processus collaborent
d'une certaine manière pour éviter ces problèmes.
L'utilisation d'une sorte de schéma de verrouillage est une
manière de prévenir ces problèmes. En
général, l'utilisation d'un schéma de verrouillage
aidera à assurer des sorties correctes mais réduit les
performances. Si vous ne voulez pas accepter la différence de
performance, il suffit de prendre des dispositions pour que chaque
processus produise un fichier de sortie distinct (ou autrement utilise des
ressources distinctes).
-
-o, --open-tty
- Rouvrir l'entrée standard en tant que
/dev/tty dans le processus enfant avant l'exécution de la
commande. Cela est utile si vous souhaitez que xargs
s'exécute dans une application interactive.
-
-p, --interactive
- Demander à l'utilisateur s'il faut exécuter
chaque ligne de commande et lire une ligne à partir du terminal.
N'exécuter la commande que si la réponse commence par
« y » ou « Y ».
Implique -t.
-
--process-slot-var=nom
- Définir la variable d'environnement nom
à une valeur unique dans chaque processus enfant
exécuté. Ces variables sont réutilisées une
fois que les processus enfant sont terminés. Cela peut être
utilisé par exemple dans un schéma de répartition de
charge rudimentaire.
-
-r, --no-run-if-empty
- Si l'entrée standard ne contient aucun
caractère non blanc, ne pas exécuter la commande.
Normalement, la commande est exécutée une fois même
s'il n'y a pas d'entrée. Cette option est une extension GNU.
-
-s nombre-max-caractères,
--max-chars= nombre-max-caractères
- Utiliser au plus nombre-max-caractères
caractères par ligne de commande, ce qui inclut la commande et les
paramètres initiaux, ainsi que les caractères nuls de
terminaison des chaînes passées en paramètres. La
valeur maximale autorisée dépend du système, et est
calculée d'après la taille limite pour exécution,
moins la taille de l'environnement, moins 2048 octets pour les
en-têtes. Si cette valeur dépasse 128 Kio, la valeur
par défaut sera 128 Kio ; dans les autres cas, la
valeur par défaut correspondra au maximum (1 Kio vaut
1024 octets). xargs s'adapte automatiquement aux contraintes
les plus strictes.
- --show-limits
- Afficher les limites de la longueur de la ligne de commande
telles qu'imposées par le système d'exploitation, le choix
dans xargs de la taille du tampon et l'option -s. Redirigez
/dev/null dans l'entrée (en indiquant éventuellement
--no-run-if-empty) si vous voulez que xargs ne fasse
rien.
-
-t, --verbose
- Afficher la ligne de commande sur la sortie d'erreur
standard avant de l'exécuter.
-
-x, --exit
- Terminer si la taille (voir l'option -s) est
dépassée.
- --help
- Afficher un résumé des options de
xargs et quitter.
- --version
- Afficher le numéro de version de xargs et
quitter.
Les options
--max-lines (
-L,
-l),
--replace
(
-I,
-i) et
--max-args (
-n) s'excluent
mutuellement. Si plusieurs d'entre elles sont spécifiées en
même temps, alors
xargs va généralement utiliser
l'option spécifiée en dernier sur la ligne de commande,
c'est-à-dire qu'il remettra l'option fautive (donnée
précédemment) à sa valeur par défaut. En plus,
xargs émettra un diagnostic d'avertissement vers la sortie
d'erreur standard (stderr). L’exception à cette règle est
que la valeur spéciale
nombre-max-param de
1
(«
-n1 ») est ignorée
après l'option
--replace ainsi que ses alias
-I et
-i parce qu'ils ne devraient pas entrer en conflit réellement.
find /tmp -name noyau -type f -print | xargs /bin/rm -f
Chercher les fichiers dont le nom est
noyau dans le répertoire
/tmp et ses sous-répertoires, et les effacer. Rappelez-vous que
vous pouvez rencontrer des problèmes si des noms de fichiers comportent
des retours à la ligne ou des espaces.
find /tmp -name noyau -type f -print0 | xargs -0 /bin/rm -f
Chercher les fichiers qui s'appellent
noyau dans le répertoire
/tmp et ses sous-répertoires, puis les effacer, en veillant
à ce que les noms de fichiers ou de répertoires qui contiennent
des retours à la ligne ou des espaces soient correctement
traités.
find /tmp -depth -name noyau -type f -delete
Chercher les fichiers qui s'appellent
noyau dans le répertoire
/tmp et ses sous-répertoires, puis les effacer, mais de
façon plus efficace que dans l'exemple précédent
(puisqu'on évite l'appel à
fork(2) et
exec(2) pour
lancer
rm, et que nous n'avons plus besoin du processus
supplémentaire
xargs).
cut -d: -f1 < /etc/passwd | sort | xargs echo
Créer une liste compacte de tous les utilisateurs sur le système.
xargs se termine avec le code de retour suivant :
- 0
- s'il réussit
- 123
- si une invocation de la commande s'est terminée avec
une valeur de retour comprise entre 1 et 125
- 124
- si la commande s'est terminée avec un code de retour
de 255
- 125
- si la commande a été tuée par un
signal
- 126
- si la commande ne peut pas être
exécutée
- 127
- si la commande n'a pas été
trouvée
- 1
- Si une autre erreur s'est produite.
Les codes de retour supérieurs à 128 sont utilisés par
l'interpréteur de commandes pour indiquer une fin de programme due
à un signal fatal.
Depuis la version 4.2.9 de GNU xargs, le comportement par défaut
de
xargs est de ne pas avoir de marqueur logique de fin de fichier. La
norme POSIX (IEEE Std 1003.1, 2004 Edition) le permet.
Les options
-l et
-i sont apparues dans la version de la norme
POSIX de 1997, mais n'apparaissent plus dans la version 2004 de la norme. Vous
devriez donc utiliser respectivement
-L et
-I, à la
place.
L'option
-o est une extension du standard POSIX pour une meilleure
compatibilité avec BSD.
Le standard POSIX permet des implémentations dans lesquelles il existe
une limite sur la taille des paramètres fournis aux fonctions
exec. La limite peut être aussi basse que 4096 octets, en
incluant la taille de l'environnement. Les scripts ne doivent pas compter sur
une taille supérieure afin d'être portables. Toutefois, je ne
connais aucune implémentation actuelle dans laquelle la limite est
aussi basse. L'option
--show-limits peut vous permettre de
connaître les limites réelles de votre système.
Il n'est pas possible d'utiliser
xargs de manière sûre, car
il y aura toujours un intervalle de temps entre la production de la liste de
fichiers en entrée et leur utilisation dans les commandes produites par
xargs. Si d'autres utilisateurs ont accès au système, ils
peuvent manipuler le système de fichiers pendant cet intervalle de
temps de façon à forcer les actions des commandes lancées
par
xargs à s'exécuter sur des fichiers non voulus. Pour
une discussion plus détaillée sur ce sujet et d'autres
problèmes qui y sont liés, veuillez consulter le chapitre
« Security Considerations » dans la documentation
Texinfo de findutils. L'option
-execdir de
find peut souvent
être utilisé comme alternative plus sûre.
Lorsque vous utilisez l'option
-I, chaque ligne lue depuis
l'entrée est mise en tampon en interne. Cela signifie qu'il y a une
limite maximale pour la longueur de la ligne que
xargs peut accepter en
entrée lorsqu'il est utilisé avec l'option
-I. Pour
contourner cette limitation, vous pouvez utiliser l'option
-s pour
augmenter la taille du tampon utilisé par
xargs, et vous pouvez
aussi utiliser un appel supplémentaire à
xargs afin de
vous assurer qu'il n'y a pas de ligne trop longue. Par exemple :
une_commande | xargs -s 50000 echo | xargs -I '{}' -s 100000 rm '{}'
Ici, le premier appel à
xargs n'a pas de limite de longueur pour
la ligne d'entrée parce que l'option
-i n'est pas
utilisée. Le deuxième appel à
xargs comporte une
telle limitation, mais nous nous sommes assurés qu'il ne lui serait
jamais soumis une ligne plus longue que ce qu'il sait traiter. Ce n'est pas
une solution parfaite. Il vaudrait mieux que l'option
-i n'impose pas
de limite à la taille de la ligne, c'est pourquoi cette discussion
apparaît dans la section BOGUES. Le problème ne se produit pas
avec la sortie de
find(1) parce qu'il ne produit qu'un seul nom de
fichier par ligne.
Aide en ligne de GNU coreutils :
<
https://www.gnu.org/software/findutils/#get-help>
Signaler toute erreur de traduction à
<
https://translationproject.org/team/fr.html>
Signaler toute autre erreur au moyen du système de suivi de bogues GNU
Savannah :
Les sujets généraux concernant le paquet GNU findutils sont
discutés sur la liste de diffusion
bug-findutils :
Copyright © 1990-2022 Free Software Foundation, Inc. License GPLv3+: GNU
GPL version 3 ou supérieure <
https://gnu.org/licenses/gpl.html>.
Ce programme est un logiciel libre. Vous pouvez le modifier et le redistribuer.
Il n'y a AUCUNE GARANTIE dans la mesure autorisée par la loi.
find(1),
kill(1),
locate(1),
updatedb(1),
fork(2),
execvp(3),
locatedb(5),
signal(7)
Documentation complète :
<
https://www.gnu.org/software/findutils/xargs>
aussi disponible localement à l’aide de la commande :
info xargs
La traduction française de cette page de manuel a été
créée par Florentin Duneau <
[email protected]>, Jean-Luc
Coulon (f5ibh) <
[email protected]>, Sylvain Cherrier
<
[email protected]>, Nicolas François
<
[email protected]> et Jean-Pierre Giraud
<
[email protected]>
Cette traduction est une documentation libre ; veuillez vous reporter
à la
GNU
General Public License version 3 concernant les conditions de copie
et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
[email protected]