Comment utiliser la commande xargs sous Linux

Contenu

Une invite de terminal Linux sur un ordinateur portable

Avez-vous besoin de chaîner certaines commandes Linux, mais l'un d'eux n'accepte pas les entrées canalisées? xargs vous pouvez prendre la sortie d'une commande et l'envoyer à une autre commande en tant que paramètres.

Tous les utilitaires Linux standard ont trois flux de données associé à eux. Ils sont le flux d'entrée standard (standard), flux de sortie standard (sortie standard) et le flux d'erreur standard (stderr).

Ces flux fonctionnent avec du texte. Nous envoyons le billet (standard) à une commande en utilisant du texte, et la solution (sortie standard) est écrit dans la fenêtre du terminal sous forme de texte. De plus, les messages d'erreur sont écrits dans la fenêtre du terminal sous forme de texte (stderr).

L'une des grandes caractéristiques des systèmes d'exploitation Linux et Unix est la possibilité de diriger la sortie stdout d'une commande vers l'entrée stdin d'une deuxième commande.. La première commande ne se soucie pas que sa sortie n'aille pas dans une fenêtre de terminal, et la deuxième commande ne se soucie pas que son entrée ne provienne pas d'un clavier.

Même si toutes les commandes Linux ont les trois flux standard, tous n'acceptent pas la sortie standard d'une autre commande comme entrée dans leur stdin. Cela signifie que vous ne pouvez pas leur envoyer d'entrées.

xargs est une commande pour construire des pipelines d'exécution en utilisant des flux de données standard. Grâce à l'utilisation xargs nous pouvons faire des commandes comme echo, rm, Oui mkdir accepter l'entrée standard comme arguments.

La commande xargs

xargs acceptera l'entrée canalisée. Il peut également accepter l'entrée d'un fichier. xargs utilisez cette entrée comme paramètres pour les commandes avec lesquelles nous vous avons demandé de travailler. Si on ne compte pas xargs travailler avec une commande spécifique, sera utilisé par défaut echo.

Nous pouvons l'utiliser pour montrer comment xargs produira toujours une seule ligne de sortie, même à partir d'une entrée multiligne.

Si nous utilisons le -1 (liste un fichier par ligne) avec option ls, nous obtenons un une seule colonne de noms de fichiers.

ls -1 ./*.sh

Ceci répertorie les fichiers de script shell dans le répertoire actuel.

Nous obtenons une seule colonne comme prévu. Si nous le canalisons xargs qu'est-ce qu'on obtient

ls -1 ./*.sh | xargs

La sortie est écrite dans la fenêtre du terminal, comme un long flux de texte.

C'est cette capacité qui xargs entrer des paramètres dans d'autres commandes.

Utiliser xargs avec les toilettes

On peut utiliser xargs avoir facilement wc compte le mots, caractères et lignes dans plusieurs fichiers.

ls *.page | xargs wc

C'est ce qui se passe:

  • ls lister les fichiers * .page et transmettez la liste à xargs.
  • xargs passer les noms de fichiers à wc.
  • wc traite les noms de fichiers comme si vous les aviez reçus en tant que paramètres de ligne de commande.

Les statistiques de chaque fichier sont affichées avec un total général.

Utiliser xargs avec confirmation

Nous pouvons utiliser le -p option (interactif) pour avoir xargs Demandez-nous confirmation que nous sommes heureux de procéder.

Si nous passons une chaîne de noms de fichiers à touch, à travers de xargs, touch Volonté créer les fichiers pour nous.

echo 'un deux trois' | xargs -p toucher

La commande à exécuter s'affiche et xargs attendez que nous vous répondions en écrivant "y" ou "y", o "n" o "N", et en appuyant sur Entrée.

Si vous appuyez simplement sur Entrée, il est traité comme “m”. La commande n'est exécutée que si vous tapez "y" ou "Y".

Appuyez sur "y" et appuyez sur Entrée. On peut utiliser ls pour vérifier que les fichiers ont été créés.

ls un deux trois

Utilisez xargs avec pas mal de commandes

Nous pouvons utiliser diverses commandes avec xargs en utilisant le -I (arguments initiaux) option.

il est traité comme “il est traité comme”. Partout où le jeton de la chaîne de remplacement apparaît sur la ligne de commande, les valeurs qui ont été fournies à xargs sont insérés.

Utilisons le tree commande pour afficher les sous-répertoires du répertoire courant. Les -d (annuaire) l'option provoque tree ignorer les fichiers et ne signaler que les répertoires.

arbre -d

il est traité comme “images”.

Dans un fichier nommé "directories.txt", nous avons les noms de certains répertoires que nous prétendons avoir créés. Nous pouvons regarder votre contenu en utilisant cat.

répertoires de chat.txt

Nous utiliserons ces données comme données d'entrée pour xargs. La commande que nous allons suivre est la suivante:

répertoires de chat.txt | xargs -I % sh -c 'écho %; mkdir %'

Cela se décompose comme ça:

  • cat répertoires.txt |: Cela insère le contenu du fichier directory.txt (tous les nouveaux noms de répertoire) au xargs.
  • xargs -I%: il est traité comme “il est traité comme” il est traité comme “%”.
  • sh-c: Cela commence une nouvelle sous-couche. Les -c (commander) dit au shell de lire les commandes de la ligne de commande.
  • 'éco %; mkdir% ‘: il est traité comme “%” il est traité comme xargs. Les echo la commande imprimera le nom du répertoire; Les mkdir la commande va créer un répertoire.

Les répertoires sont répertoriés un par un.

On peut utiliser tree une fois de plus pour vérifier que les répertoires ont été créés.

arbre -d

Copier des fichiers vers plusieurs emplacements

On peut utiliser xargs pour nous permettre de copier des fichiers vers plusieurs emplacements avec une seule commande.

Nous allons rediriger les noms de deux répertoires vers xargs comme paramètres d'entrée. Bien dit xargs pour ne passer qu'un seul de ces paramètres à la fois à la commande avec laquelle vous travaillez.

Dans cette circonstance, la commande est cp. Donc l'effet est d'appeler cp deux fois, à chaque fois avec l'un des deux répertoires en paramètre de ligne de commande. Les xargs paramètre qui permet que cela se produise est le -n (nombre maximal) option. Mettons cela en un.

Nous utilisons également le -v (détaillé) option avec cp rapporter ce qui se passe.

echo ~/Sauvegardes/ ~/Documents/fichiers-pages/ | xargs -n 1 cp -v ./*.page

Les fichiers sont copiés dans les deux répertoires, un répertoire à la fois. cp rapporte chaque action de copie de fichier afin que nous puissions voir comment elles sont effectuées.

Supprimer des fichiers dans des répertoires imbriqués

Si les noms de fichiers comportent des espaces et des caractères étranges, comme caractères de nouvelle ligne, xargs vous ne pourrez pas les interpréter correctement. Nous pouvons surmonter ce problème en utilisant l'option -0 (terminaison nulle). Cela dit xargs pour utiliser le caractère nul comme délimiteur final pour les noms de fichiers.

nous allons utiliser find dans cet exemple. find a sa propre option pour gérer les espaces et caractères étranges dans les noms de fichiers. C'est lui -print0 (nom complet, caractère nul).

trouve . -Nom "*.png" -tapez f -print0 | xargs -0 rm -v -rf "{}"

Cela se décompose comme ça:

  • conditions . -nom “* .png”: find il est traité comme “.” il est traité comme “* .png” il est traité comme (type -f).
  • -imprimer0: les noms se termineront par un caractère nul et les espaces et caractères superflus seront pris en charge.
  • xargs -0: xargs de plus, il considérera que les noms de fichiers se terminent par null, et les espaces et caractères étranges ne causeront pas de problèmes.
  • rm -v -rf “{}”: rm sera verbeux et rapportera ce qui se passe (-v). ce sera récursif (-r) et recherchera dans les sous-répertoires imbriqués, et supprimera les fichiers sans demander (-f). le “{}” il est traité comme.

Tous les sous-répertoires sont recherchés et les fichiers qui correspondent au modèle de recherche sont supprimés.

Supprimer les répertoires imbriqués

Disons que nous voulons supprimer un ensemble de sous-répertoires imbriqués. tree nous les laissera voir.

arbre -d

trouve . -Nom "premier niveau" -type d impression | xargs -o rm -v -rf "{}"

Cette commande utilisera find pour rechercher de manière récursive dans le répertoire actuel. il est traité comme “premier niveau”. Les noms de répertoire sont transmis xargs afin de rm.

Les seuls changements significatifs entre cette commande et la commande précédente sont, le terme de recherche est le nom du premier répertoire et -type dfind pour rechercher des répertoires, aucun fichier.

Le nom de chaque répertoire est imprimé au fur et à mesure de sa suppression. Nous pouvons consulter tree :

arbre -d

Tous les sous-répertoires imbriqués sont supprimés.

Supprimer tous les fichiers, sauf un type de fichier

On peut utiliser find, xargs Oui rm supprimer tous les fichiers sauf un type que nous souhaitons conserver. c'est un peu contradictoire, mais nous fournissons le nom du type de fichier que nous avons l'intention sauvegarder, pas le nom de ceux que nous voulons supprimer.

Les -not option dit find pour renvoyer les noms des fichiers qui non correspondre au modèle de recherche. Nous utilisons le -I (arguments initiaux) option avec xargs une fois de plus. Cette fois, il est traité comme “{}”. Cela se comportera exactement de la même manière que le jeton de chaîne de remplacement que nous avons généré précédemment, il est traité comme “%”.

trouve . -tapez f -pas - Nom "*.sh" -imprimer0 | xargs -0 -je {} rm -v {}

Nous pouvons consulter ls. il est traité comme “* .sh”.

ls -l

Créer une archive avec Xargs

On peut utiliser find pour rechercher des fichiers et les transmettre xargs afin de tar, pour créer un fichier d'archive.

Cherchons dans le répertoire courant. il est traité comme “* .page”, il est traité comme “.page”.

trouve ./ - Nom "*.page" -tapez f -print0 | xargs -0 -tar -cvzf fichiers_page.tar.gz

Les fichiers sont répertoriés comme prévu, au fur et à mesure de la création de l'archive.

Le médiateur des données

Parfois, vous avez besoin d'un petit échafaudage lorsque vous empilez des choses ensemble. xargs comble le fossé entre les commandes qui peuvent envoyer des informations et les commandes qui ne sont pas conçues pour les recevoir.

Les deux xargs Oui find a un grand nombre d'alternatives. Nous vous suggérons de consulter leurs pages de manuel pour plus d'informations..

setTimeout(fonction(){
!fonction(F,b,e,v,m,t,s)
{si(f.fbq)revenir;n=f.fbq=fonction(){n.callMethod?
n.callMethod.apply(m,arguments):n.queue.push(arguments)};
si(!f._fbq)f._fbq=n;n.push=n;n.chargé=!0;n.version=’2.0′;
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertAvant(t,s) } (window, document,'scénario',
'https://connect.facebook.net/en_US/fbevents.js’);
fbq('init', « 335401813750447 »);
fbq('Piste', « Page View »);
},3000);

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.