Össze kell fűzni néhány Linux-parancsot, de az egyik nem fogadja el a vezetékes bevitelt? Az xargs átveheti az egyik parancs kimenetét, és paraméterként elküldheti egy másik parancsnak.
Az összes szabványos Linux segédprogram rendelkezik három adatfolyam hozzájuk kapcsolódó. Ezek a szabványos bemeneti adatfolyam (stdin), a szabványos kimeneti adatfolyam (stdout) és a szabványos hibafolyam (stderr).
Ezek az adatfolyamok szöveggel működnek. Szöveg segítségével bemenetet (stdin) küldünk egy parancsnak, és a válasz (stdout) szövegként kerül a terminálablakba. A hibaüzenetek szövegként (stderr) is megjelennek a terminál ablakában.
A Linux és Unix-szerű operációs rendszerek egyik nagyszerű tulajdonsága, hogy az egyik parancs stdout kimenetét egy második parancs stdin bemenetére lehet továbbítani. Az első parancsot nem érdekli, hogy a kimenete ne egy terminálablakba kerüljön, a második parancsot pedig nem érdekli, hogy a bemenete nem billentyűzetről érkezik.
Bár az összes Linux-parancs rendelkezik a három szabványos adatfolyammal, nem mindegyik fogadja el egy másik parancs stdoutját az stdin bemeneteként. Ez azt jelenti, hogy nem lehet bemenetet bevinni hozzájuk.
Az xargs egy parancs végrehajtási folyamatok felépítésére a szabványos adatfolyamok használatával. Az xargs használatával olyan parancsokat állíthatunk elő, mint az echo, rm és mkdir, hogy szabványos bemenetet fogadjanak el argumentumként.
Tartalomjegyzék
A xargs parancs
Az xargs elfogadja a vezetékes bemenetet. Fájlból is képes bemenetet fogadni. Az xargs ezt a bemenetet használja azon parancsok paramétereiként, amelyekkel működnie kellett. Ha nem mondjuk meg az xargs-nak, hogy egy adott paranccsal működjön, akkor alapértelmezés szerint az echo-t fogja használni.
Ezt felhasználhatjuk annak bemutatására, hogy az xargs mindig egy sor kimenetet generál, még többsoros bemenetről is.
Ha a -1 (soronként egy fájl listázása) opciót használjuk az ls-szel, akkor a fájlnevek egyetlen oszlopa.
ls -1 ./*.sh
Ez felsorolja a shell script fájlokat az aktuális könyvtárban.
A várakozásoknak megfelelően egyetlen oszlopot kapunk. Ha átvezetjük xargs-on, mit kapunk?
ls -1 ./*.sh | xargs
A kimenet egy hosszú szövegfolyamként kerül a terminálablakba.
Ez a képesség az, hogy az xargs paramétereket tápláljon be más parancsokba.
xargs használata wc-vel
Az xargs segítségével könnyen meg tudjuk számolni a wc-t szavakat, karaktereket és sorokat több fájlban.
ls *.page | xargs wc
Ez történik:
Az ls felsorolja a *.page fájlokat, és átadja a listát az xargs-nek.
Az xargs átadja a fájlneveket a wc-nek.
A wc úgy kezeli a fájlneveket, mintha parancssori paraméterként kapta volna őket.
Az egyes fájlok statisztikái a teljes összeggel együtt jelennek meg.
Az xargs használata megerősítéssel
Használhatjuk a -p (interaktív) opciót, hogy az xargs megerősítse, hogy örülünk a folytatásnak.
Ha a touch fájlnevek sorát adjuk át az xargs-en keresztül, a touch will hozza létre a fájlokat nekünk.
echo 'one two three' | xargs -p touch
Megjelenik a végrehajtandó parancs, és az xargs „y” vagy „Y”, vagy „n” vagy „N” beírásával és az Enter lenyomásával várja, hogy válaszoljunk.
Ha csak megnyomja az Enter billentyűt, a rendszer „n”-ként kezeli. A parancs csak akkor kerül végrehajtásra, ha „y” vagy „Y” karaktert ír be.
Megnyomtuk az „y”-t és az Entert. Az ls segítségével ellenőrizhetjük, hogy a fájlok létrejöttek-e.
ls one two three
Az xargs használata több paranccsal
Több parancsot is használhatunk az xargs-szel a -I (kezdeti argumentumok) kapcsoló használatával.
Ez az opció egy „csere-karakterláncot” határoz meg. Ahol a parancssorban megjelenik a helyettesítő karakterlánc jogkivonata, az xargs számára megadott értékek beszúrásra kerülnek.
Használjuk a fa paranccsal az aktuális könyvtár alkönyvtárait. A -d (könyvtár) kapcsoló hatására a fa figyelmen kívül hagyja a fájlokat, és csak a könyvtárakról készít jelentést.
tree -d
Egyetlen „images” nevű alkönyvtár van.
A „könyvtárak.txt” nevű fájlban megvannak néhány létrehozni kívánt könyvtár neve. A tartalmát a cat segítségével tekinthetjük meg.
cat directories.txt
Ezt fogjuk használni az xargs bemeneti adataként. A parancs, amit teljesíteni fogunk, a következő:
cat directories.txt | xargs -I % sh -c 'echo %; mkdir %'
Ez így bomlik:
cat directories.txt |: Ez a directories.txt fájl tartalmát (az összes új könyvtárnevet) az xargs-ba helyezi.
xargs -I %: Ez egy „csere-karakterláncot” határoz meg a „%” tokennel.
sh -c: Ez egy új alhéjat indít el. A -c (parancs) arra utasítja a shellt, hogy olvassa el a parancsokat a parancssorból.
‘visszhang %; mkdir %’: minden „%” token le lesz cserélve az xargs által átadott könyvtárnevekre. Az echo parancs kiírja a könyvtár nevét; az mkdir parancs létrehozza a könyvtárat.
A könyvtárak egyenként vannak felsorolva.
A fa segítségével még egyszer ellenőrizhetjük, hogy a könyvtárak létrejöttek-e.
tree -d
Fájlok másolása több helyre
Az xargs segítségével egyetlen paranccsal több helyre másolhatunk fájlokat.
Bemeneti paraméterként két könyvtár nevét fogjuk bevezetni az xargs-ba. Megmondjuk az xargs-nak, hogy egyszerre csak az egyik paramétert adja át annak a parancsnak, amellyel dolgozik.
Ebben az esetben a parancs a cp. Tehát a hatás az, hogy kétszer hívjuk meg a cp-t, minden alkalommal a két könyvtár valamelyikével, mint parancssori paraméterrel. Az xargs paraméter, amely ezt lehetővé teszi, az -n (max. szám) opció. Ezt egynek fogjuk beállítani.
A -v (bőbeszédű) opciót is használjuk a cp-vel, hogy jelezze, mi történik.
echo ~/Backups/ ~/Documents/page-files/ | xargs -n 1 cp -v ./*.page
A fájlokat a rendszer a két könyvtárba másolja, egyszerre egy könyvtárba. A cp minden fájlmásolási műveletet jelent, hogy láthassuk azok végbemenését.
Fájlok törlése a beágyazott könyvtárakban
Ha a fájlnevekben szóközök és furcsa karakterek vannak – például újsor karakterek –, az xargs nem tudja megfelelően értelmezni őket. Ezt a problémát a -0 (null terminátor) opció használatával oldhatjuk meg. Ez arra utasítja az xargs-t, hogy a null karaktert használja a fájlnevek végső határolójaként.
Ebben a példában a find parancsot fogjuk használni. A keresésnek megvan a maga lehetősége szóközzel foglalkozik és furcsa karakterek a fájlnevekben. Ez a -print0 (teljes név, null karakter) opció.
find . -name "*.png" -type f -print0 | xargs -0 rm -v -rf "{}"
Ez így bomlik:
megtalálja . -name „*.png”: a find az aktuális „” könyvtárban fog keresni.” a „*.png”-vel megegyező nevű objektumokhoz, amelyek fájlok (-f típusú).
-print0: a neveket null karakter zárja le, és a szóközök és a furcsa karakterek figyelembevételre kerülnek.
xargs -0: az xargs a fájlneveket is null-végűnek tekinti, és a szóközök és a furcsa karakterek nem okoznak problémát.
rm -v -rf „{}”: az rm bőbeszédű lesz, és beszámol arról, hogy mi történik (-v). Rekurzív lesz (-r), átnézi a beágyazott alkönyvtárakat, és felszólítás nélkül eltávolítja a fájlokat (-f). A „{}” helyére minden fájlnév lép.
A rendszer minden alkönyvtárat megkeres, és a keresési mintának megfelelő fájlok törlődnek.
Beágyazott könyvtárak eltávolítása
Tegyük fel, hogy el szeretnénk távolítani egy sor beágyazott alkönyvtárat. a fa meglátja őket.
tree -d
find . -name "level_one" -type d printo | xargs -o rm -v -rf "{}"
Ez a parancs a find segítségével rekurzívan keres az aktuális könyvtárban. A keresési cél egy „level_one” nevű könyvtár. A könyvtárnevek az xargs-en keresztül kerülnek át az rm-be.
Az egyetlen jelentős változás a parancs és az előző parancs között az, hogy a keresési kifejezés a legfelső könyvtár neve, a -type d pedig azt mondja, hogy a find könyvtárakat keres, nem fájlokat.
Az eltávolításkor minden könyvtár neve kinyomtatásra kerül. A fával ellenőrizhetjük:
tree -d
Az összes beágyazott alkönyvtár törlődik.
Az összes fájl törlése, egy fájltípus kivételével
A find, xargs és rm paranccsal törölhetjük az összes fájlt, kivéve egy megőrizni kívánt típust. Ez kissé ellentmondásos, de a megtartani kívánt fájltípus nevét adjuk meg, nem a törölni kívánt fájltípusok nevét.
A -not opció azt mondja, hogy a find a keresési mintának nem megfelelő fájlok nevét adja vissza. Ismét az -I (kezdeti argumentumok) opciót használjuk az xargs-szal. Ezúttal az általunk definiált csere-karakterlánc token a „{}”. Ez pontosan ugyanúgy fog viselkedni, mint a korábban generált csere-karakterlánc token, amely történetesen „%” volt.
find . -type f -not - name "*.sh" -print0 | xargs -0 -I {} rm -v {}
ls-el ellenőrizhetjük. Csak azok a fájlok maradtak a könyvtárban, amelyek megfeleltek a „*.sh” keresési mintának.
ls -l
Archív fájl létrehozása Xargs segítségével
A find segítségével kereshetünk fájlokat, és átadhatjuk őket az xargs-en keresztül a tar-ba, archív fájl létrehozásához.
Az aktuális könyvtárban fogunk keresni. A keresési minta „*.page”, tehát „.page” fájlokat fogunk keresni.
find ./ - name "*.page" -type f -print0 | xargs -0 -tar -cvzf page_files.tar.gz
A fájlok a várt módon megjelennek a listában, ahogy az archív fájl létrejön.
Az adatközvetítő
Néha szükséged van egy kis állványzatra, amikor egymásra rakod a dolgokat. Az xargs áthidalja a szakadékot az információt kiszívni képes parancsok és az olyan parancsok között, amelyek nem arra épülnek, hogy befogadják.
Mind a xargs, mind a find rengeteg lehetőséget kínál. Ha többet szeretne megtudni, nézze meg a man oldalukat.