Joudutko jonottamaan joitain Linux-komentoja yhteen, mutta yksi niistä ei hyväksy piped-syöttöä? xargs
voi ottaa tulosteen yhdestä komennosta ja lähettää sen toiseen komentoon parametreina.
Kaikissa tavallisissa Linux-apuohjelmissa on kolmeniihin liittyvät tietovirrat. Ne ovat tavallinen tulovirta (stdin), normaali lähtövirta (stdout) ja tavallinen virhevirta (stderr).
Nämä virrat toimivat tekstin kanssa. Lähetämme syötteen (stdin) komentoon tekstin avulla, ja vastaus (stdout) kirjoitetaan terminaali-ikkunaan tekstinä. Virheviestit kirjoitetaan myös pääteikkunaan tekstinä (stderr).
Yksi Linuxin ja Unixin kaltaisista hienoista ominaisuuksistakäyttöjärjestelmät ovat kyky liittää stdout-lähtö yhdestä komennosta toisen komennon stdin-sisääntuloon. Ensimmäinen komento ei välitä siitä, että sen lähtö ei mene pääteikkunaan, ja toinen komento ei välitä siitä, että sen tulo ei tule näppäimistöltä.
Vaikka kaikilla Linux-komennoilla on kolme vakiovirtaa, kaikki eivät hyväksy toisen komennon stdout-tuloa stdiniinsa. Tämä tarkoittaa, että et voi pilata tuloa heihin.
xargs
on komento suorittamiseen liittyvien putkistojen rakentamiseksi standardidatavirtojen avulla. Käyttämällä xargs
voimme tehdä komentoja, kuten echo
, rm
ja mkdir
hyväksy normaalitulot argumentteina.
Xargs-komento
xargs
hyväksyy piipputulon. Se voi myös hyväksyä syötteen tiedostosta. xargs
käyttää tätä tuloa parametreina komennoille, joiden kanssa olemme käskeneet sen toimimaan. Jos emme kerro xargs
työskennellä tietyn komennon kanssa, jota se käyttää oletusarvoisesti echo
.
Voimme käyttää sitä osoittamaan kuinka xargs
tuottaa aina yhden rivin lähtöä, jopa monirivisestä tulosta.
Jos käytämme -1
(lista yksi tiedosto rivillä) -vaihtoehto näppäimellä ls
, saamme yhden sarakkeen tiedostonimiä.
ls -1 ./*.sh
Tämä luettelee nykyisen hakemiston komentosarjatiedostot.
Saamme yhden sarakkeen odotetusti. Jos putket sen läpi xargs
mitä me saamme?
ls -1 ./*.sh | xargs
Tulos kirjoitetaan terminaali-ikkunaan yhtenä pitkänä tekstivirrana.
Juuri tämä kyky on xargs
syötä parametrit muihin komentoihin.
Xargs-sovelluksen käyttö wc: llä
Voimme käyttää xargs
saada helposti wc
laske sanat, merkit ja rivit useisiin tiedostoihin.
ls *.page | xargs wc
Näin tapahtuu:
ls
luettelee * .sivutiedostot ja välittää luettelonxargs
.xargs
välittää tiedostonimetwc
.wc
käsittelee tiedostonimiä ikään kuin se olisi saanut ne komentoriviparametreina.
Kunkin tiedoston tilastotiedot näytetään yhdessä kokonaismäärän kanssa.
Xargin käyttö vahvistuksen kanssa
Voimme käyttää -p
(interaktiivinen) vaihtoehto xargs
kysy meiltä vahvistuksia siitä, että olemme iloisia sen jatkamisesta.
Jos siirrämme merkkijonon tiedostonimiä touch
, kautta xargs
, touch
luo tiedostot meille.
echo 'one two three' | xargs -p touch
Suoritettava komento tulee näkyviin ja xargs
odottaa vastausta kirjoittamalla “y” tai “Y” tai “n” tai “N” ja painamalla Enter.
Jos painat vain Enter, sitä kohdellaan “n”. Komento suoritetaan vain, jos kirjoitat “y” tai “Y”.
Painoimme “y” ja painaa Enter. Voimme käyttää ls
tarkistaaksesi, että tiedostot on luotu.
ls one two three
Xargin käyttö useilla komennoilla
Voimme käyttää useita komentoja xargs
käyttämällä -I
(alkuperäiset argumentit) -vaihtoehto.
Tämä vaihtoehto määrittelee ”korvaavan merkkijonon”. Aina kun korvausmerkkijonon tunnus näkyy komentorivillä, arvot, jotka toimitettiin xargs
lisätään.
Käytämme tree
komento tarkastella alihakemistoja nykyisestä hakemistosta. -d
(hakemisto) -vaihtoehdon syyt tree
ohittaa tiedostot ja raportoida vain hakemistoista.
tree -d
On yksi alihakemisto nimeltään “images”.
Tiedostossa nimeltä “hakemistot.txt” meillä on joidenkin hakemistojen nimet, jotka haluamme luoda. Voimme tarkastella sen sisältöä käyttämällä cat
.
cat directories.txt
Aiomme käyttää tätä lähdetietoina xargs
. Käsky on seuraava:
cat directories.txt | xargs -I % sh -c 'echo %; mkdir %'
Tämä jakautuu seuraavasti:
- kissan hakemistot.txt |: Tämä työntää directrories.txt-tiedoston (kaikki uudet hakemistonimet) sisällön
xargs
. - xargs -I%: Tämä määrittelee ”korvata-merkkijonon” merkillä ”%”.
- sh -c: Tämä aloittaa uuden alakentän.
-c
(komento) käskee kuoren lukemaan komentoja komentoriviltä. - 'Kaiku%; mkdir% ”: Jokainen ”%” -merkki tulee korvaamaan ohitetut hakemistonimet
xargs
.echo
komento tulostaa hakemiston nimen;mkdir
komento luo hakemiston.
Hakemistot luetellaan yksi kerrallaan.
Voimme käyttää tree
jälleen kerran tarkistaaksesi hakemistojen luomisen.
tree -d
Tiedostojen kopiointi useisiin paikkoihin
Voimme käyttää xargs
jotta voimme kopioida tiedostoja useisiin paikkoihin yhdellä komennolla.
Aiomme piilottaa kahden hakemiston nimet xargs
tuloparametreina. Me kerromme xargs
välittää vain yksi näistä parametreista kerrallaan komennolle, jonka kanssa se työskentelee.
Tässä tapauksessa komento on cp
. Joten vaikutus on soittaa cp
kahdesti, joka kerta yhdellä kahdesta hakemistosta komentoriviparametrina. xargs
parametri, joka sallii tämän tapahtua, on -n
(enimmäismäärä) vaihtoehto. Aiomme asettaa tämän yhdeksi.
Käytämme myös -v
(verbose) vaihtoehto cp
niin että se raportoi mitä tapahtuu.
echo ~/Backups/ ~/Documents/page-files/ | xargs -n 1 cp -v ./*.page
Tiedostot kopioidaan kahteen hakemistoon, yksi hakemisto kerrallaan. cp
raportoi kustakin kopiointitoiminnosta, jotta voimme nähdä niiden tapahtuvan.
Tiedostojen poistaminen sisäkkäisistä hakemistoista
Jos tiedostonimissä on välilyöntejä ja outoja merkkejä, kuten rivinmerkkejä, xargs
ei osaa tulkita niitä oikein. Voimme ratkaista ongelman käyttämällä -0 (nollaterminaattori) -vaihtoehtoa. Tämä kertoo xargs
käyttää nollamerkkiä tiedostonimien lopullisena erottimena.
Aiomme käyttää find
tässä esimerkissä. find
on oma vaihtoehto käsitellä tyhjää tilaa ja outoja merkkejä tiedostonimissä. Se on -print0
(koko nimi, nolla merkki) -vaihtoehto.
find . -name "*.png" -type f -print0 | xargs -0 rm -v -rf "{}"
Tämä jakautuu seuraavasti:
- löytö . -nimi “* .png”:
find
etsii nykyisestä hakemistosta “.” objekteja, joiden nimet vastaavat ”* .png” ja jotka ovat tiedostoja (type -f
). - -print0: nimet lopetetaan nollamerkillä, välilyönnit ja outot merkit otetaan huomioon.
- xargs -0: xargs aikoo myös pitää tiedostonimiä nollasta päättyvänä, ja välilyönnit ja outot merkit eivät aiheuta ongelmia.
- rm -v -rf “{}": rm tulee sanallisesti ja raportoi tapahtuvasta (
-v
). Se tulee olemaan rekursiivinen (-r) ja se tarkastelee sisäkkäisiä alihakemistoja ja poistaa tiedostoja ilman kehotusta (-f
). Korvataan {}} jokaisella tiedostonimellä.
Kaikista alihakemistoista etsitään, ja hakumallia vastaavat tiedostot poistetaan.
Sisäkkäisten hakemistojen poistaminen
Oletetaan, että haluamme poistaa joukon sisäkkäisiä alihakemistoja. tree
anna meidän nähdä ne.
tree -d
find . -name "level_one" -type d printo | xargs -o rm -v -rf "{}"
Tämä komento käyttää etsintää rekursiivisesti hakuun nykyisestä hakemistosta. Hakukohde on hakemisto nimeltä “level_one”. Hakemistonimet viedään läpi xargs
että rm
.
Ainoat merkittävät muutokset tämän ja edellisen komennon välillä ovat, että hakutermi on ylimmän hakemiston nimi, ja -type d
kertoo find
hakemaan hakemistoja, ei tiedostoja.
Kunkin hakemiston nimi tulostetaan, kun se poistetaan. Voimme tarkistaa tree
:
tree -d
Kaikki sisäkkäiset alihakemistot poistetaan.
Kaikkien tiedostojen poistaminen, paitsi yksi tiedostotyyppi
Voimme käyttää find
, xargs
ja rm
poistaa kaikki tiedostot paitsi yksi tyyppi, jonka haluamme säilyttää. Se on hiukan vastaintuitiivinen, mutta annamme tiedostotyypin nimen, jota haluamme pitää, ei niiden nimet, jotka haluamme poistaa.
Ja -not
vaihtoehto kertoo find
palauttaa tiedostojen nimet älä vastaa hakukaavaa. Käytämme -I
(alkuperäiset argumentit) -vaihtoehto näppäimellä xargs
vielä kerran. Tällä kertaa määrittelemämme korvamerkkimerkki on “{}”. Tämä toimii täsmälleen samalla tavalla kuin aiemmin luoma korvausmerkkimerkki, joka sattui olemaan “%”.
find . -type f -not - name "*.sh" -print0 | xargs -0 -I {} rm -v {}
Voimme tarkistaa ls
. Ainoat hakemistoon jäljellä olevat tiedostot ovat tiedostoja, jotka vastasivat * .sh-hakumallia.
ls -l
Arkistotiedoston luominen Xargsilla
Voimme käyttää find
etsiä tiedostoja ja välittää ne xargs
että tar
, luodaksesi arkistotiedoston.
Aiomme etsiä nykyisestä hakemistosta. Hakumallina on ”* .page”, joten etsimme “.page”-tiedostoja.
find ./ - name "*.page" -type f -print0 | xargs -0 -tar -cvzf page_files.tar.gz
Tiedostot luetellaan odotetusti, kun arkistotiedosto luodaan.
Tietovälittäjä
Joskus tarvitset vähän telineitä, kun pinot asioita yhteen. xargs
siltaa aukon komentojen välillä, jotka voivat poistaa tietoja, ja komentojen välillä, joita ei ole rakennettu ottamaan niitä käyttöön.
molemmat xargs
ja find
on valtava määrä vaihtoehtoja. Sinua kannustetaan tarkistamaan hänen man-sivut saadaksesi lisätietoja.