GNU/Linux >> Tutoriels Linux >  >> Linux

8 exemples pratiques de la commande Linux Xargs pour les débutants

Les xargs de Linux La commande n'est peut-être pas un outil de ligne de commande très populaire, mais cela n'enlève rien au fait qu'elle est extrêmement utile, surtout lorsqu'elle est combinée avec d'autres commandes comme find et grep . Si vous débutez avec xargs et que vous souhaitez comprendre son utilisation, vous serez heureux de savoir que c'est exactement ce que nous allons faire ici.

Before we proceed, please keep in mind that all the examples presented in this tutorial have been tested on Ubuntu 18.04 LTS (Bionic Beaver). Shell used is Bash, and version is 4.4.19.

1. Comment fonctionne la commande Xargs ?

Eh bien, avant de passer à son utilisation, il est important de comprendre ce que fait exactement Xargs. En termes simples, l'outil - dans sa forme la plus basique - lit les données de l'entrée standard (stdin) et exécute la commande (qui lui est fournie en tant qu'argument) une ou plusieurs fois en fonction de l'entrée lue. Tous les blancs et espaces dans l'entrée sont traités comme des délimiteurs, tandis que les lignes vides sont ignorées.

Si aucune commande n'est fournie comme argument à xargs, la commande par défaut que l'outil exécute est echo . Par exemple, dans l'exemple suivant, je viens d'exécuter 'xargs' et d'entrer 'Hello World' sur stdin. Lorsque j'ai appuyé sur Ctrl + D (pour indiquer à xargs que nous en avons terminé avec l'entrée), le écho La commande a été exécutée automatiquement et 'Hello World' a été imprimé à nouveau.

2. Comment utiliser xargs avec une autre commande ?

Pendant que écho est la commande par défaut que xargs exécute, vous pouvez explicitement spécifier n'importe quelle autre commande. Par exemple, vous pouvez transmettre la commande find avec son option "-name" en tant qu'argument à xargs, puis transmettre le nom du fichier (ou du type de fichiers) que vous souhaitez trouver pour rechercher en entrée via stdin.

Voici la commande complète en question :

xargs find -name

Par exemple, nous avons fourni "*.txt" en entrée via stdin, ce qui signifie que nous voulons le trouver commande pour rechercher tous les fichiers .txt dans le répertoire courant (ainsi que ses sous-répertoires).

Voici la commande en action :

3. Comment faire en sorte que xargs exécute la commande plusieurs fois (une fois pour chaque ligne/argument d'entrée)

Dans l'exemple dont nous avons discuté dans la section précédente, nous voulions rechercher des fichiers .txt, nous avons donc fourni "*.txt" dans l'entrée. Mais que se passe-t-il si l'exigence est de rechercher également d'autres types de fichiers, comme .log et .tmp ?

Essayez de les donner en entrée à xargs après "*.txt" et voyez ce qui se passe. Eh bien, vous devriez obtenir une erreur semblable à la suivante :

C'est parce que xargs passe "*.txt" et "*.log" comme entrée de nom de fichier à find commande puis trouver échoue car il s'exécute avec deux noms de fichiers en entrée. Vous pouvez imaginer que la commande find s'exécute de la manière suivante :

find -name "*.txt" "*.log"

Et ce n'est pas la bonne méthode.

Ce que nous voulons, c'est que la commande xargs passe d'abord "*.txt" à find commande, de sorte que trouver nous donne des résultats liés aux fichiers .txt, puis "*.log" est passé. Cela peut être fait en utilisant le -L l'option de ligne de commande fournie par xargs.

Le -L L'option de ligne de commande nécessite un nombre qu'elle traite comme le nombre maximal de lignes non vides qui doivent être transmises en tant qu'entrée à la commande en une seule fois. Donc, dans notre cas, cette valeur sera 1, car nous voulons qu'une ligne d'entrée soit transmise en tant qu'entrée à find à la fois.

Alors, voici la commande que nous devrions exécuter :

xargs -L 1 find -name

La capture d'écran suivante montre la commande susmentionnée en action :

Jusqu'ici tout va bien. Mais que se passe-t-il si vous transmettez l'entrée de la manière suivante :

"*.txt" "*.log"

Eh bien, la commande échouera car '-L 1' s'assurera que la ligne complète est passée à find commande.

Dans de telles situations, vous pouvez utiliser l'option de ligne de commande '-n'.

L'option de ligne de commande '-n', comme '-L', nécessite un nombre qui représenterait le nombre d'arguments que xargs doit passer par ligne de commande. Dans le cas dont nous venons de parler, "*.txt" et "*.log" devraient être des arguments différents, et puisque nous voulons qu'ils soient transmis individuellement, nous devrons fournir '1' comme valeur à '-n' .

xargs -n 1 trouver -nom

Voici donc comment nous pouvons faire en sorte que xargs exécute une commande plusieurs fois.

4. Comment faire en sorte que xargs gère les noms de fichiers avec des espaces

Si vous vous souvenez, au début, nous avons mentionné que xargs traite les espaces (ainsi que les caractères de nouvelle ligne) comme des délimiteurs. Cela peut entraîner des problèmes dans les cas où les noms de fichiers transmis en entrée à xargs contiennent des espaces.

Par exemple, supposons que le répertoire actuel contienne un fichier nommé "new music.mp3" et que vous souhaitiez que xargs transmette ce nom à mplayer afin que ce dernier puisse lire le fichier. Si vous suivez la voie conventionnelle, vous obtiendrez une erreur :

C'est parce qu'en raison de l'espace entre 'new' et 'music.mp3', ceux-ci sont traités comme deux fichiers différents par mplayer. Une façon de résoudre ce problème consiste à utiliser une barre oblique inverse tout en fournissant l'entrée :

new\ music.mp3

L'autre façon est de changer le délimiteur, ce que vous pouvez faire en utilisant le -d option. Par exemple, vous pouvez demander à xargs de ne considérer que la nouvelle ligne comme délimiteur, ce qui peut être fait de la manière suivante :

xargs -d '\n' mplayer

5. Comment faire en sorte que xargs gère les noms de fichiers avec des caractères de nouvelle ligne

Donc, maintenant nous savons comment nous pouvons faire en sorte que xargs gère les noms de fichiers contenant des espaces blancs. Mais qu'en est-il des nouvelles lignes ? Oui, les noms de fichiers peuvent également avoir des caractères de saut de ligne. Par exemple, il existe un fichier nommé 'foo'[newline]'file.txt'. Sur le terminal, le nom s'affiche sous la forme 'foo?file.txt'.

Maintenant, supposons que je veuille la trouver pour rechercher tous les fichiers dont le nom commence par le texte "foo", puis utilisez xargs pour ouvrir ces fichiers dans gedit . Voici la commande :

find . -name "foo*" | xargs gedit

Malheureusement, la commande n'atteint pas son objectif car un nouveau fichier portant le nom "foo" s'ouvre dans Gedit. C'est probablement parce que le caractère de nouvelle ligne est traité comme un délimiteur par xargs.

Pour régler ce problème, utilisez le -print0 option qui trouve des offres et la couple avec le -0 de xarg option. Voici comment la page de manuel de find explique cette option :

 -print0
True; print the full file name on the standard output, followed by a null character (instead of thenewline character that -print uses). This allows file names that contain newlines or other types ofwhite space to be correctly interpreted by programs that process the find output. This option corresponds to the -0 option of xargs.

Donc, voici la commande que nous devrions utiliser :

find . -name "foo*" -print0 | xargs -0 gedit

6. Comment trouver des fichiers contenant un texte spécifique

La commande xargs est très pratique si vous souhaitez rechercher des fichiers contenant un texte/une chaîne spécifique. Par exemple, si vous souhaitez rechercher des fichiers .txt contenant le texte "abc", vous pouvez le faire de la manière suivante :

find -name "*.txt" | xargs grep "abc"

Voici la commande en action :

Comme il est assez évident, dans ce cas, la commande xargs obtient son entrée de la find commande.

7. Comment faire en sorte que xargs accepte les entrées d'un fichier 

Jusqu'à présent, nous avons vu xargs accepter les entrées de stdin (qui est le comportement par défaut) ainsi que d'une autre commande (discutée dans la dernière section). Cependant, si vous le souhaitez, vous pouvez également faire en sorte que xargs accepte les entrées d'un fichier.

Le -a de la commande option vous permet de le faire. Cette option attend un nom de fichier - ce serait le fichier à partir duquel xargs lira l'entrée.

Par exemple, supposons qu'il y ait un fichier avec le nom 'input.txt'. Il contient l'entrée pour xargs (essentiellement, le contenu est composé de deux noms de fichiers :testfile1.txt et testfile2.txt). Voici comment xargs peut être utilisé pour lire l'entrée de ce fichier et la transmettre à une autre commande, par exemple ls .

xargs -a input.txt ls -lart

Voici la commande en action :

8. Comment faire en sorte que xargs demande l'autorisation de l'utilisateur avant d'exécuter une commande

Nous avons déjà expliqué comment vous pouvez faire en sorte que xargs exécute une commande plusieurs fois (voir le point 3 ci-dessus). Mais que se passe-t-il si vous voulez que xargs demande votre permission à chaque fois qu'il exécute la commande ? Est-ce possible? Oui, c'est - le -p l'option de ligne de commande le rend possible.

Voici un exemple d'exécution de xargs en mode interactif :

Nous venons d'effleurer la surface ici car il existe de nombreuses autres fonctionnalités fournies par la commande xargs sous la forme d'options de ligne de commande. Essayez les concepts/fonctionnalités de xargs que nous avons expliqués dans ce didacticiel, et en cas de doute ou de question, consultez sa page de manuel.


Linux
  1. 10 exemples de commandes 'rm' pour les débutants Linux

  2. 10 exemples de commandes Linux Cat pour les débutants

  3. Tutoriel de commande cd Linux pour les débutants (8 exemples)

  4. Commande Linux killall pour les débutants (8 exemples)

  5. Exemples de commandes xargs sous Linux

Tutoriel de commande Linux ss pour les débutants (8 exemples)

Commande de localisation Linux pour les débutants (8 exemples)

16 exemples pratiques de commande Linux LS pour les débutants

Explication de la commande Linux mv pour les débutants (8 exemples)

12 exemples pratiques d'In Command sous Linux

Exemples de commandes Linux xargs