Les xargs
L'utilitaire vous permet de créer et d'exécuter des commandes à partir d'une entrée standard. Il est généralement utilisé en combinaison avec d'autres commandes via la tuyauterie.
Avec xargs
, vous pouvez fournir une entrée standard comme argument aux utilitaires de ligne de commande comme mkdir
et rm
.
Dans ce didacticiel, nous aborderons les bases de l'utilisation de xargs
commande.
Comment utiliser Linux xargs
Commande #
xargs
lit les arguments de l'entrée standard, séparés par des espaces ou des retours à la ligne, et exécute la commande spécifiée en utilisant l'entrée comme arguments de la commande. Si aucune commande n'est fournie, la valeur par défaut est /bin/echo
.
La syntaxe pour le xargs
commande est la suivante :
xargs [OPTIONS] [COMMAND [initial-arguments]]
L'exemple le plus basique d'utilisation de xargs
serait de passer plusieurs chaînes séparées par des espaces en utilisant un tube vers xargs
et exécutez une commande qui utilisera ces chaînes comme arguments.
echo "file1 file2 file3" | xargs touch
Dans l'exemple ci-dessus, nous dirigeons l'entrée standard vers xargs
, et le touch
La commande est exécutée pour chaque argument, créant trois fichiers. C'est la même chose que si vous exécutiez :
touch file1 file2 file3
Comment afficher la commande et demander à l'utilisateur #
Pour imprimer la commande sur le terminal avant de l'exécuter, utilisez le -t
(--verbose
) :
echo "file1 file2 file3" | xargs -t touch
touch file1 file2 file3
Si vous souhaitez obtenir une invite indiquant si vous souhaitez exécuter chaque commande avant de l'exécuter, utilisez le -p
(--interactive
) :
echo "file1 file2 file3" | xargs -p touch
Tapez y
ou Y
pour confirmer et lancer la commande :
touch file1 file2 file3 ?...y
Cette option est utile lors de l'exécution de commandes destructives.
Comment limiter le nombre d'arguments #
Par défaut, le nombre d'arguments passés à la commande est déterminé par la limite du système.
Le -n
(--max-args
) spécifie le nombre d'arguments à passer à la commande donnée. xargs
exécute la commande spécifiée autant de fois que nécessaire jusqu'à ce que tous les arguments soient épuisés.
Dans l'exemple suivant, le nombre d'arguments lus à partir de l'entrée standard est limité à 1.
echo "file1 file2 file3" | xargs -n 1 -t touch
Comme vous pouvez le voir dans la sortie détaillée ci-dessous, la commande touch est exécutée séparément pour chaque argument :
touch file1
touch file2
touch file3
Comment exécuter plusieurs commandes #
Pour exécuter plusieurs commandes avec xargs
, utilisez le -I
option. Cela fonctionne en définissant un replace-str
après le -I
option et toutes les occurrences de replace-str
sont remplacés par l'argument passé à xargs.
Les xargs
suivants exemple exécutera deux commandes, d'abord il créera les fichiers en utilisant touch
, puis il listera les fichiers avec le ls
commande :
echo "file1 file2 file3" | xargs -t -I % sh -c '{ touch %; ls -l %; }'
-rw-r--r-- 1 linuxize users 0 May 6 11:54 file1
-rw-r--r-- 1 linuxize users 0 May 6 11:54 file2
-rw-r--r-- 1 linuxize users 0 May 6 11:54 file3
Un choix courant pour replace-str
est %
. Cependant, vous pouvez utiliser un autre espace réservé, par exemple, ARGS
:
echo "file1 file2 file3" | xargs -t -I ARGS sh -c '{ touch ARGS; ls -l ARGS; }'
Comment spécifier un délimiteur #
Utilisez le -d
(--delimiter
) pour définir un délimiteur personnalisé, qui peut être soit un caractère unique, soit une séquence d'échappement commençant par \
.
L'exemple suivant, nous utilisons ;
comme délimiteur :
echo "file1;file2;file3" | xargs -d \; -t touch
touch file1 file2 file3
Comment lire les éléments du fichier #
La commande xargs peut également lire des éléments d'un fichier au lieu de l'entrée standard. Pour ce faire, utilisez le -a
(--arg-file
) suivi du nom du fichier.
Dans l'exemple suivant, le xargs
la commande lira le ips.txt
fichier et ping chaque adresse IP.
8.8.8.8
1.1.1.1
Nous utilisons également le -L 1
option, qui indique xargs
lire une ligne à la fois. Si cette option est omise xargs
transmettra toutes les IP à un seul ping
commande.
xargs -t -L 1 -a ips.txt ping -c 1
ping -c 1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=50 time=68.1 ms
...
ping -c 1 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=59 time=21.4 ms
Utilisation de xargs
avec find
#
xargs
est le plus souvent utilisé en combinaison avec find
commande. Vous pouvez utiliser find
pour rechercher des fichiers spécifiques, puis utilisez xargs
pour effectuer des opérations sur ces fichiers.
Pour éviter les problèmes avec les noms de fichiers contenant des retours à la ligne ou d'autres caractères spéciaux, utilisez toujours la recherche -print0
option, qui provoque find
pour imprimer le nom complet du fichier suivi d'un caractère nul. Cette sortie peut être correctement interprétée par xargs
en utilisant le -0
, (--null
).
Dans l'exemple suivant, find
imprimera les noms complets de tous les fichiers à l'intérieur du /var/www/.cache
répertoire et xargs
transmettra les chemins de fichiers au rm
commande :
find /var/www/.cache -type f -print0 | xargs -0 rm -f
Utilisation de xargs pour couper les caractères d'espace blanc #
xargs
peut également être utilisé comme outil pour supprimer les espaces des deux côtés d'une chaîne donnée. Dirigez simplement la chaîne vers le xargs
commande, et il fera le rognage :
echo " Long line " | xargs
Long line
Cela peut être utile lors de la comparaison de chaînes dans des scripts shell.
#!/bin/bash
VAR1=" Linuxize "
VAR2="Linuxize"
if [[ "$VAR1" == "$VAR2" ]]; then
echo "Strings are equal."
else
echo "Strings are not equal."
fi
## Using xargs to trim VAR1
if [[ $(echo "$VAR1" | xargs) == "$VAR2" ]]; then
echo "Strings are equal."
else
echo "Strings are not equal."
fi
Strings are not equal.
Strings are equal.
Conclusion #
xargs
est un utilitaire de ligne de commande sous Linux qui vous permet de créer et d'exécuter des commandes.
Pour des informations plus détaillées sur chaque xargs
option, lisez la page de manuel xargs.
Si vous avez des questions ou des commentaires, n'hésitez pas à laisser un commentaire.