Xargs parancs alapjai

Xargs nem egy mindennap használt parancs, jellemzően nem is ismerik. Én sem nagyon ismertem, de egy cikket olvasva érdekesnek és bemutatandónak találtam az xargs parancsot. Az xargs Linux parancs lehetővé teszi a felhasználó számára, hogy parancsokat, parancs sorozatokat hajtson végre a szabványos bemenetről. Ha ez zavarosan hangzik, talán egyszerűbb, ha megnézünk egy egyszerű példát. A következő cat parancs az xargs segítségével az ls parancs által listázott összes fájlt megjeleníti.

ls | xargs cat

Aki nem ismerné az ls-t érdemes elolvasni pár cikket róla, vagy legalább a manuáljának első felét. Listázó parancs, ami jellemzően az állományokat listázza ki egy adott könyvtárban. A cat pedig az állomány tartalmát írja ki a terminálunkba. A | jel padig a pipe, azaz csővezeték jel. Amivel értelemszerűen összekötjük a parancsokat, egymásnak adjuk át a paramétereket. Ez nagyon jól használható eszköz az egyik parancs kimenetének a másik parancs bemenetével való összekötésére, mint egy sima csővezetékkel kötnénk össze.

Próbáljuk ki!

A teszteléshez hozzunk létre három sima szövegállományt 1.txt 2.txt 3.txt névvel, egy üres könyvtárban. A tartalma legyen „ez a fájl1” stb. Így már tudni fogjuk, hogy éppen melyik fájl tartalmát látjuk a terminálban.

Majd adjuk ki a ls parancsot, és listázzuk ki a három fájl nevét. Ha minden jó, akkor a fenti paranccsal teszteljük le a xargs parancsot. Ebben az esetben, ha minden jó, akkor a kimenet ilyen lesz:

ez a fájl1
ez a fájl2
ez a fájl3

Szuper, bár nagyon nem tudjuk használni semmire, de a tesztnek megfelelően kilistázta a három fájl tartalmát. Logikus, hogy bármilyen parancs kimeneteit, ha az többféle (pld. összetettebb keresés több fájlt talált meg) xargs összeköti egy feldolgozó parancs bemenetével és akkor automatikusan elvégzi a feladatot az összes fájlon.

Az xargs legtöbb használatakor egy parancs kimenetét kell csatolni egy másik parancshoz, egymás után. Azaz előbb érdemes letesztelni az első parancsrészt, aminek ha jó kimenete, csak akkor kerüljön be az xargs paranccsal a következőbe.

Miben más mint a pipe?

Logikus kérdés, hiszen az összekötésre lehetne a pipe (|) jelet is használni. Itt egyesével kapja meg a paramétereket, azaz közel olyan, mintha a

cat 1.txt 

cat 2.txt 

cat 3.txt

vagy a

cat 1.txt 2.txt 3.txt

parancsot külön-külön futtattuk volna le.

Igen, tudom, ezt meg lehetne oldani másképp is, pld. ciklusokkal. A Linux előnye, hogy sokféleképp megoldható egy-egy feladat.

Mostani élő példa: több száz rádiós anyag leírását listáztattam ki, majd egy szöveges állományba küldtem át. Így egy nagy szövegben simán tudok keresni szövegszerkesztőben és nem kell a grep és trásai parancsokat használni. Kicsit durva megoldás, de arra jó, hogy egy-egy színészre rákeressek.

Csak ennyit tud az xargs?

Természetesen nem! Több olyan kapcsolóját megnézzük most, ami hasznos lehet.

Kövesd az alábbi példákat, hogy lásd, hogyan lehet használni az xargs-t kényelmesen és a feladatodnak megfelelően.

Ha szeretnél meggyőződni a második parancs pontos paraméterezéséről, akkor érdemes -t kapcsolót használni. Ez ajánlott minden esetben, ha bizonytalan vagy, hogy az első (itt az ls) által adott paraméterek jól kerülnek be az xargs segítségével a másodikba. Lehetnek olyan parancsok, ahol elvárt az egyszerű megoldásoktól eltérnek!

ls | xargs -t cat

cat 1.txt 2.txt 3.txt

ez a fájl1

ez a fájl2

ez a fájl3

Itt a második sorban látod a cat parancsot és a paramétereit. Itt alapvetően nem létszükség a -t kapcsoló, de túl nagy problémát nem okozhatsz.

Biztos, ami biztos : xargs -p

Használhatjuk a -p opciót is, amely megerősítést kér tőlünk a parancs végrehajtása előtt. Ez praktikus például a rm vagy komolyabban a fájlokat megváltoztató parancs futtatásakor, mivel nem akarunk véletlenül egyetlen fájlt sem törölni, megváltoztatni. Megadhatjuk az y-t (igen) a parancs futtatásának megerősítéséhez, vagy n (nem) megszakítását jelenti majd.

ls | xargs -p rm

rm 1.txt 2.txt 3.txt? ...

majd y vagy n lenyomására vár. Vedd észre (és mindig figyelj az ilyen apróságokra), hogy nem kell itt a -t kapcsoló, hanem automatikusan kiírja a második parancsot felparaméterezve. Itt is figyelni kell arra, hogy az xargs csak átadja a paramétert, de ha ahhoz a parancshoz valami kapcsoló stb. kell, akkor azt neked kell ellenőrizni. Vagy beleütközhetsz jogosultsági hiányosságba, ha pld. a fenti könyvtárban nincs jogod törölni. Ez természetes, de nem árt kiemelni.

Bőbeszédűbb megoldások

Korábbi példánkban az xargs végrehajtatja a cat 1.txt 2.txt 3.txt parancsot. Más szavakkal, csak egyetlen parancsot hajt végre, és az összes fájlnév csatolásra kerül. A xargs parancsokat külön-külön futtathatjuk a -n (max argumentum) opció használatával. Itt van egy példa, ahol az -t opciót is használjuk, így láthatjuk, hogy ez a parancs hogyan hajtja végre a cat három fájlon külön-külön, de egymás után.

ls | xargs -t -n 1 cat

cat 1.txt

ez a file1

cat 2.txt

ez a file2

cat 3.txt

ez a file3

Én ezt szeretem, mert sokszor a keresési eredményeknél jó, ha látom melyik fájl kerül éppen feldolgozásra. Nagyon kényelmes, ha egy könyvtárban ki akarok íratni több sima szövegfájlt, és az egyikben van az az infó, ami nekem kell. Így látom, hogy melyik is az a fájl.

Az -n 1 opció ebben az esetben azt mondja az xargs-nak, hogy egyszerre csak egy fájlnevet használhat (maximum). Logikusan megemelve az összeget egyszerre több paramétert is átadhat. Itt is figyeljünk arra, hogy itt sima "listázd ki, jelenítsd meg" feladatot végzünk el, ahol a cat gond nélkül fogadja az xargs által neki átadott paramétereket, a legalább egy fájlnevet. Ha minden paraméterre, amit az első parancs készített egyszerre szükség van, akkor ne korlátozzuk le! Mindig logikusan járj el, és használd a -t és -p kapcsolót,  hogy lásd is mit teszel és egyszerűen, ha nem tetszik a parancssor, ki tudj lépni.

Több parancsot is kezel az xargs

ls *.txt | xargs -t -I% sh -c '{ touch -m %; cat %; }'

A példa összetettnek tűnik, de nem az. A feladat egyszerű: frissítse a módosítás idejét és írassa ki a tartalmát.

Azaz a xargs több parancsot is futtathat, ha használjuk az -I opciót. Meg kell adni egy "lecserélési/helyettesítési karakterlánc”-ot, amelyet használni szeretnél ezzel az opcióval. Nagyon gyakori a százalékjel (-I%). Érdemes itt is figyelni, mert pár program saját maga is használja a % jelet (pld. date) akkor mást kell választani. A sh -c '{ touch -m %; cat %; }' szerkezetben meg mondjuk, hogy a touch -m parancs mögé tegye be a ls *.txt által kapott paraméter(eke)t, majd azután a cat után is tegye be ugyanezt. Így a ls parancs paraméterei (amit itt a % jelképez) a teljes lefutásig megmaradnak, nem kell újra lekérdezni őket. Itt összevonásra került a

ls *.txt | xargs -t touch -m
ls *.txt | xargs -t cat

parancs. Jelen esetben nem ez nem túl nagy időmegtakarítás, hiszen három fájlt kilistázni nem túl nagy idő. Komolyabb, hosszabban tartó első parancsnál már lehetnek gyorsulások. Igen, tudom! Első nekifutásra, nulla gyakorlattal ezek a fura karakterhalmazok erősen hasonlítanak a krix-kraxokra, de egy kis próbálgatás, tanulás után már értelmezhető lesz. Majd - aki akarja - meg is lehet ezeket szeretni!

Fájlból vett paraméterek

Az xargs másik praktikus használata, hogy képes befogadni a fájlokból származó bemeneteket. Azaz ha van egy sima szövegfájlod, abban egy csomó paraméter - jelen esetben fájlnevek - akkor megadhatod a xargs-al a beolvastatást.

Ez az -a opcióval történik. Vegyük például a következő parancsot, ahol átadjuk a fájlnevek listáját az xargs-nak, majd ezeket a fájlokat a cat-nak.

Előbb készítsük el a listafájlunkat, amit kétféleképp tehetünk meg. Az egyik, hogy szövegszerkesztővel a könyvtárunkba készítünk egy

1.txt 2.txt 3.txt

tartalmú file.txt fájlt. A másik már „linuxosabb”.

ls > file.txt

Majd a

xargs -t -a file.txt cat

paranccsal már nem az ls, hanem az -a után megadott szövegfájlból kinyert sorokat adunk meg.

Béna, és amúgy sincs haszna! Hm… igen a példa egy óvódás szintű példa. De ezzel a módszerrel, a megfelelő parancsokkal megteheted, hogy a mostani, belakott Linuxodból lekérdezed az összes telepített csomagot, majd egy újratelepítés után csak ezt a listát olvastatod be a csomagkezelőddel telepítendő listának… Keress rá a linuxmint.hu oldalom az xargs és a kimarite szóra, ott kapsz egy tippet a témában!

Bármi olyan listaszerűen felsorolható bemenő értékre nagyon jó az xargs, amivel valamit szeretnél tenni egy programmal.

Find és a xargs

Az xargs egyik leggyakoribb használata, amikor a find paranccsal kombinálják. A find már tartalmaz egy -exec opciót, így képes parancsokat végrehajtani minden megtalált fájlon, de az xargs sokkal hatékonyabb. A find parancsban hozzá kell adnia az -print0 opciót, így minden fájlnév után egy extra nulla karakter kerül kiírásra. A parancsnak tartalmaznia kell egy megfelelő -0 opciót is xargs oldalán is, hogy tudja mi az elválasztó karakter. A példa szerint, ahol .txt fájlokat keresünk és cat paranccsal egyesével kiíratjuk.

Hozzáfűzzük az -t opciót, és az -n opciót is a jobb átláthatóság kedvéért. Jobb az elején a tesztelési próbálgatási időben mindent látni amit a parancsunk csinál...

find /home/laci/teszt -name "*.txt" -print0 | xargs -t -n 1 -0 cat

Körülbelül ennyi lenne az alap, amivel szerintem el lehet indulni. Gyakorlatilag a fantázia és a feladat szab határt az xargs használatának. Érdemes észben tartani a lehetőséget, mert akár egy másik parancs eredményét a következőbe áttenni, akár pedig egy fájlból kiolvasott sorokat beilleszteni egy parancsba nagyon hasznos tud lenni.

Az is igaz, hogy a használata első ránézésre nem egyszerű, de kis gyakorlás és logikus átgondolás után már nem okozhat gondot.

A témát egy linuxconfig.org-os cikk ihlette.