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
, et 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
. Lesecho
la commande imprimera le nom du répertoire; Lesmkdir
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
pour 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 d
dé find
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
et 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
pour 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
et 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);