/ / Kuinka käyttää xargs-komentoa Linuxissa

Kuinka käyttää xargs-komentoa Linuxissa

Linux-päätekehote kannettavalle tietokoneelle

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, rmja 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

v pääteikkunassa

Tämä luettelee nykyisen hakemiston komentosarjatiedostot.

ls: n lähtö terminaali-ikkunassa

Saamme yhden sarakkeen odotetusti. Jos putket sen läpi xargs mitä me saamme?

ls -1 ./*.sh | xargs

ls -1 ./*.sh | xargs terminaali-ikkunassa

Tulos kirjoitetaan terminaali-ikkunaan yhtenä pitkänä tekstivirrana.

Se toimitetaan xargin läpi pääteikkunassa

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

ls * .sivu | xargs wc pääteikkunassa

Näin tapahtuu:

  • ls luettelee * .sivutiedostot ja välittää luettelon xargs.
  • xargs välittää tiedostonimet wc.
  • wc käsittelee tiedostonimiä ikään kuin se olisi saanut ne komentoriviparametreina.

wc-lähtö terminaali-ikkunassa

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

kaiku 'yksi kaksi kolme' | xargs -p kosketa pääteikkunassa

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”.

xargs pyytää vahvistusta pääteikkunassa

Painoimme “y” ja painaa Enter. Voimme käyttää ls tarkistaaksesi, että tiedostot on luotu.

ls one two three

ls: n lähtö terminaali-ikkunassa

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

puu-d pääteikkunassa

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

kissan hakemistot.txt terminaali-ikkunassa

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.

kissan hakemistot.txt | xargs -I% sh -c 'kaiku%; mkdir% 'pääteikkunassa

Hakemistot luetellaan yksi kerrallaan.

xargs-tuloste pääteikkunassa

Voimme käyttää tree jälleen kerran tarkistaaksesi hakemistojen luomisen.

tree -d

lähtö puusta terminaali-ikkunassa

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

echo ~ / Varmuuskopiot / ~ / Asiakirjat / sivutiedostot / | xargs -n 1 cp -v ./*.sivu terminaali-ikkunassa

Tiedostot kopioidaan kahteen hakemistoon, yksi hakemisto kerrallaan. cp raportoi kustakin kopiointitoiminnosta, jotta voimme nähdä niiden tapahtuvan.

xargs- ja cp-tuloste pääteikkunassa

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ä.

löytö . -nimi "* .png" -tyyppi f -print0 | xargs -0 rm -v -rf "{}" pääteikkunassa

Kaikista alihakemistoista etsitään, ja hakumallia vastaavat tiedostot poistetaan.

Rm: n lähtö terminaali-ikkunassa

Sisäkkäisten hakemistojen poistaminen

Oletetaan, että haluamme poistaa joukon sisäkkäisiä alihakemistoja. tree anna meidän nähdä ne.

tree -d

puu-d pääteikkunassa

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.

löytö . -nimi "level_one" -tyyppinen d tuloste | xargs -o rm -v -rf "{}" pääteikkunassa

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.

Lähtö haku- ja xargs- ja rm-tiedostoista pääteikkunassa

Kunkin hakemiston nimi tulostetaan, kun se poistetaan. Voimme tarkistaa tree :

tree -d

puu-d pääteikkunassa

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 {}

löytö . -tyyppinen f -not - nimi "* .sh" -print0 | xargs -0 -I {} rm -v {} pääteikkunassa

Voimme tarkistaa ls. Ainoat hakemistoon jäljellä olevat tiedostot ovat tiedostoja, jotka vastasivat * .sh-hakumallia.

ls -l

lähtö ls: stä pääteikkunassa

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

löytää ./ - nimi "* .sivu" -tyyppi f-print0 | xargs -0 -tar -cvzf page_files.tar.gz pääteikkunassa

Tiedostot luetellaan odotetusti, kun arkistotiedosto luodaan.

tervan lähtö terminaali-ikkunassa

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.