Az xargs parancs használata Linuxon

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

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.

  Hogyan próbáld ki a nyílt forráskódú Firefox alternatívát, a LibreWolfot Linuxon

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.

  Az Adwaita Tweaks telepítése a Gnome Shellhez Linuxon

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.

  Mi az a Finsta, és hogyan kell használni?

megtalálja .  -név

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.

megtalálja .  -név

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

megtalálja .  -type f -not - né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

keresse meg a ./ - nevet

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.