HTML

Bagoj úr blogja

Kíváncsi Bagoj befigyel a Linux belsejébe, illetve különféle Linux terjesztéseket próbál ki. Ha jó napja van, scriptet ír Neked.

Friss topikok

Terítéken az xargs

2010.01.09. 05:59 bagoj ur

Kivonat a Linux Útikalauzból: "Hogy miféle állat is az xargs? A Te Legjobb Szkriptező Haverod, Akivel Pompásan Érzed Magad."

És valóban! Konzolon rengeteg munkától ment meg minket ez a szerény, elfeledett de igen hatékony parancssori program. Mit is tud ez?

- Nem mást tud, mint a(z általában pipe-on keresztül) megkapott paraméterekre parancsokat tud lefuttatni. Elég egyszerű feladatocska, de ezt tökéletesen végzi el.

Példa:

find /tmp -maxdepth 1 -name "*mp3" | xargs rmHalljuk az ördög ügyvédjét:

ördög ügyvédje: "Pheee, mi szükség van erre? Ott van a bash lehetősége:"

for i in /tmp/*mp3; do rm $i; done

"vagy még egyszerűbben"

rm `find tmp -maxdepth 1 -name '*.mp3'`
Bagoj úr: Na igen, néhány fájl esetén ezeknek a parancsoknak semmi problémája nincs a /tmp könyvtárból az mp3 végződésű fájlok kitörlésével. De próbáljuk meg ugyanezt néhány ezer fájlra is, és rögtön megkapjuk az "Argument lista túl hosszú" hibaüzenetet, míg az xargs tetszőleges mennyiségű fájlra működni fog.

ördög ügyvédje: "Na neee már! A linux kernel 2.6.23-as verziójától fogva nincs ilyen hiba, már akármennyi fájlt le tudok kezelni az én (sokkal egyszerűbb) módszereimmel is."

Bagoj úr: És szerinted jó dolog nem hordozható kódot írni?

ördög ügyvédje: "Mondjuk pont nem érdekel..."

Bagoj úr: És mi van a szóközt (vagy perverz embereknél: tabot :-) tartalmazó fájlnevekkel? Az általad ajánlott módszerek a whitespace-t elválasztó jelnek veszik, emiatt felléphetnek problémák. Viszont a xargs tud \0 (null) karakterrel elválasztott sztringeket is kezelni, a find pedig a -print0 paraméter hatására ilyeneket tud küldeni:

find /tmp -maxdepth 1 -name *mp3 -print0 | xargs -0 rm
ördög ügyvédje
: "Hm..."

Miután az ördög ügyvédje feloldódott egy logikai buborékban, nézzük a további lehetőségeinket. Például van egy szöveges fájlunk, benne pedig két oszlopban elhelyezve fájlnevek, amikkel kezdenünk kell valamit - mondjuk hasonlítsuk össze őket! A szövegfájl tartalma tehát:

index.php index.php.old
login.php login.php.old
view.php view.php.old

Vegyük rá xargs haverunkat, hogy a szövegfájl tartalmát kettes csoportokban vegye át, és futtassa rájuk a diff nevű, népszerű kis parancsot:

xargs -t -n2 diff < szövegfájlEz fog történni:

diff index.php index.php.old
diff login.php login.php.old
diff view.php view.php.old
...

Ha még azt is hozzáteszem, hogy az előbbi php-k php.old-dá átnevezésére is van egy jó tippem:

find . -name *php -print0 | xargs -0 grep -l -Z "FIXME" | xargs -0 -i cp {} {}.old

Ehhez már adok magyarázatot is: A find-dal rákeresünk a *php fájlra, és NULL karakterrel elválasztva átadjuk a xargs-nak; amely ráfuttatja a grep-pet ezekre és rátalál mindegyikre, amiben a "FIXME" karaktersorozat benne van. Ennek eredménye ismét egy fájl lista, tehát szépen lehet egy újabb pipe-pal egy újabb xargs-nak átadni, amely készít egy másolatot a fájlokról <fájlnév>.old néven. (Igen, a {} karakterek helyére a fájlnevet fogja behelyettesíteni, a find-hoz hasonlóan.)

Természetesen határt csak a fantáziánk szabhat. Például képzeljük el, hogy van egy nagy rakás szerverünk, amelyet kulcsos authentikációval scp-n keresztül elérünk, mindegyikre szeretnénk egy fájlt átmásolni és van egy szerverek.txt fájlunk, amelyben megvan a rakás szerver ip-cím vagy host név listája. Ekkor:

cat iplist | xargs -n1 scp <másolandófile.tgz>

 

Szólj hozzá!

Címkék: linux sok összehasonlítás fájl átnevezés törlés parancssor kezelése xargs

A bejegyzés trackback címe:

https://bagojur.blog.hu/api/trackback/id/tr611531635

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.