Xargs: Difference between revisions
No edit summary |
|||
(20 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
==Sissejuhatus== | ==Sissejuhatus== | ||
xargs käsku kasutatakse juhtudeks, kus on vaja jaotada mingi käsu tegevused väiksemateks gruppideks. xargs sai loodud probleemi tõttu, kus käsul on liiga palju argumente ning kernel (kuni versioonini 2.6.23) ei ole võimeline käivitama käsku. | xargs käsku kasutatakse juhtudeks, kus on vaja jaotada mingi käsu tegevused väiksemateks gruppideks. xargs sai loodud probleemi tõttu, kus käsul on liiga palju argumente ning kernel (kuni versioonini 2.6.23) ei ole võimeline käivitama käsku. | ||
Line 8: | Line 6: | ||
Näide, kus käsu käivitamine ebaõnnestub liigsete argumentide hulga tõttu: | Näide, kus käsu käivitamine ebaõnnestub liigsete argumentide hulga tõttu: | ||
< | <source lang="bash"> | ||
$ mv * /mingi/teine/kataloog/ | $ mv * /mingi/teine/kataloog/ | ||
bash: /bin/mv: Argument list too long | bash: /bin/mv: Argument list too long | ||
</ | </source> | ||
[[Xargs#K.C3.B5ikide_kaustas_olevate_peidetud_failide_ja_kaustade_.C3.BCmbert.C3.B5stmine|Toimiv näide]], kuidas ümber tõsta suurt hulka faile/kaustu. | |||
==Süntaks== | ==Süntaks== | ||
''<argumendid>'' | '''xargs''' ''<võtmed> <käsk <võtmed>>'' | ''<argumendid>'' | '''xargs''' ''<võtmed> <käsk <võtmed>>'' | ||
===Põhilised võtmed=== | |||
*'''-a <failinimi>''' - argumendid loetakse failist standard sisendi asemel | |||
*'''-0''' - määrab ära, et argumendid on eraldatud ''null karakteriga'', vajalik selleks kui argument sisaldab tühikut või reavahetust | |||
*'''-n <argumentide arv>''' - määrab maksimaalse argumentide arvu, mis antakse soovitud käsu sisendiks. | |||
*'''-d <eraldaja>''' - võimalik määrata argumentide eraldaja käsitsi, vaikimisi tühik või reavahetus | |||
*'''-p''' - küsib kinnitust iga käsu rea käivitamise kohta. | |||
*'''-r''' - määrab ära, et käsku ei käivitata kui standard sisend on tühi, st sisaldab ainult tühikuid | |||
*'''-t''' - enne käsu käivitamist, trükitakse käsu rida standard vea väljundisse | |||
*'''-E <lõpu tähis>''' - võimalik määrata faili lõpu tähis, vajalik võtme '''-a''' kasutamisel | |||
*'''-e<lõpu tähis>''' - võtme -E sünonüüm, pole POSIX ühilduv | |||
*'''--help''' - kuvatakse käsu '''xargs''' abiinfo | |||
*'''--version''' - trükib käsu '''xargs''' versiooni numbri | |||
===Sekundaarsed võtmed=== | |||
*'''-I <asendus tekst>''' | |||
*'''-i<asendus tekst>''' | |||
*'''-L <ridade arv>''' | |||
*'''-l<ridade arv>''' | |||
*'''-s <maksimaalsete tähtede arv>''' | |||
*'''--show-limits''' | |||
*'''-x''' | |||
*'''-P <maksimaalsete protsesside arv>''' | |||
Rohkem infot - http://www.softpanorama.org/Tools/xargs.shtml | |||
==Näited== | ==Näited== | ||
===Argumentide väljastamine kolme kaupa=== | ===Argumentide väljastamine kolme kaupa=== | ||
$ echo 1 2 3 4 5 6 7 8 | '''xargs''' | <source lang="bash"> | ||
$ echo 1 2 3 4 5 6 7 8 | xargs -n 3 echo | |||
</source> | |||
või | |||
<source lang="bash"> | |||
$ echo 1 2 3 4 5 6 7 8 | xargs -n 3 | |||
</source> | |||
'''echo''' on '''xargs''' vaikimisi käsk, seega ei ole tarvis määrata käsku. | |||
''-n 3'' määrab, et käsu ''standard sisendi'' tulemust kuvatakse kolme kaupa | '''-n 3''' määrab, et käsu ''standard sisendi'' tulemust kuvatakse kolme kaupa | ||
< | <source lang="bash"> | ||
$ echo 1 2 3 4 5 6 7 8 | xargs -n 3 | $ echo 1 2 3 4 5 6 7 8 | xargs -n 3 | ||
1 2 3 | 1 2 3 | ||
4 5 6 | 4 5 6 | ||
7 8 | 7 8 | ||
</ | </source> | ||
===Määratud laiendiga failide kustutamine avatud kataloogis=== | |||
<source lang="bash"> | |||
$ find . -name *.log | xargs rm | |||
</source> | |||
'''find''' võtmete selgitus: | |||
*'''.''' - otsitakse faile avatud kataloogis | |||
*'''-name *.log''' - failid on mistahes nimega kuid laiendiga ''.log'' | |||
===Määratud laiendiga failide kustutamine avatud kataloogis, kus faili nimedes on tühikud või reavahetused=== | |||
<source lang="bash"> | |||
$ find . -name *.log -print0 | xargs -0 rm | |||
</source> | |||
'''find''' võtmete selgitus: | '''find''' võtmete selgitus: | ||
*''.'' - otsitakse faile avatud kataloogis | *'''.''' - otsitakse faile avatud kataloogis | ||
*''-name *.log'' - failid on mistahes nimega kuid laiendiga ''.log'' | *'''-name *.log''' - failid on mistahes nimega kuid laiendiga ''.log'' | ||
*''-print0'' - leitud argumendid eraldatakse ''null karakteriga'' | *'''-print0''' - leitud argumendid eraldatakse ''null karakteriga'' | ||
'''xargs''' võtmete selgitus: | '''xargs''' võtmete selgitus: | ||
*''-0'' määrab, et käsu ''standard sisendi'' tulemust eraldaja ei ole tühik ega reavahetus vaid ''null karakter''. Vajalik selleks, kui faili nimed sisaldavad tühikuid või reavahetusi. | *'''-0''' määrab, et käsu ''standard sisendi'' tulemust eraldaja ei ole tühik ega reavahetus vaid ''null karakter''. Vajalik selleks, kui faili nimed sisaldavad tühikuid või reavahetusi. | ||
===Kõikide arvuti kasutajate kuvamine viie kaupa=== | |||
<source lang="bash"> | |||
cut -d: -f1 < /etc/passwd | sort | xargs -n 5 | |||
</source> | |||
'''cut''' võtmete selgitus: | |||
*'''-d:''' - välja eraldajaks on ":" | |||
*'''-f1''' - valitakse esimene väli | |||
'''xargs''' võtmete selgitus: | |||
*'''-n 5''' - standard sisendi argumente kuvatakse viie kaupa | |||
<source lang="bash"> | |||
$ cut -d: -f1 < /etc/passwd | sort | xargs -n 5 | |||
avahi avahi-autoipd backup bin daemon | |||
games gdm gnats hplip irc | |||
kernoops libuuid list lp mail | |||
man messagebus news nobody proxy | |||
pulse root rtkit saned speech-dispatcher | |||
sync sys syslog student usbmux | |||
uucp www-data | |||
</source> | |||
===Kõikide kaustas olevate peidetud failide ja kaustade ümbertõstmine=== | |||
<source lang="bash"> | |||
find . -path "./*" -name "[!.]*" -print0 | xargs -r0 mv --target="/mingi/teine/kataloog" | |||
</source> | |||
'''find''' võtmete selgitus: | |||
*'''.''' - otsitakse hetkel avatud kaustast | |||
*'''-path "./*"''' - määrab ära otsingu sügavuse, praegusel juhul ka alamfailid ja -kaustad | |||
*'''-name "[!.]*"''' - määrab ära, et otsitakse punktiga algavaid faile ning kaustu | |||
*'''-print0''' - leitud argumendid eraldatakse ''null karakteriga'' | |||
'''xargs''' võtmete selgitus: | |||
* '''-r0''' - '''r''' määrab ära, et käsku '''mv''' ei käivitata kui standard sisend on tühi ning '''0''' määrab standard sisendi eraldajaks ''null karakteri''' | |||
'''mv''' võtmete selgitus: | |||
*'''--target="/mingi/teine/kataloog"''' - kaustad ning failid tõstetakse ümber asukohta ''/mingi/teine/kataloog'' | |||
==Kokkuvõte== | ==Kokkuvõte== | ||
xargs vajadus tekkis kunagi Linuxi kerneli ARG_MAX parameetri tõttu, mis sätestas maksimaalsete argumentide hulga. Alates linux-2.6.23 kernelist on antud parameeter eemaldatud. | |||
Kuid siiski on xargs senini kasulik töövahend, näiteks: | |||
<source lang="bash"> | |||
$ find -name "*~" -exec rm | |||
</source> | |||
sellise käsu käivitamisel luuakse iga faili kohta eraldi kustutamise protsess. | |||
Kui aga: | |||
<source lang="bash"> | |||
$ find -name "*~" | xargs rm | |||
</source> | |||
siis ei käivitata iga kustutuse jaoks eraldi protsessi, vaid xargs kontrollib maksimaalsete argumentide hulka ning vastavalt sellele on ka käivitatud protsesside hulk väiksem. | |||
==Allikad/Allikad== | ==Allikad/Allikad== | ||
Latest revision as of 11:41, 22 June 2011
Sissejuhatus
xargs käsku kasutatakse juhtudeks, kus on vaja jaotada mingi käsu tegevused väiksemateks gruppideks. xargs sai loodud probleemi tõttu, kus käsul on liiga palju argumente ning kernel (kuni versioonini 2.6.23) ei ole võimeline käivitama käsku.
- xargs loeb argumente standard sisendist
- xargs standard sisendi argumendid on piiritletud tühikutega või reavahetustega
- peale standard sisendi lugemist käivitatakse soovitud käsk üks või mitu korda standard sisendist saadud argumentidega.
Näide, kus käsu käivitamine ebaõnnestub liigsete argumentide hulga tõttu:
$ mv * /mingi/teine/kataloog/
bash: /bin/mv: Argument list too long
Toimiv näide, kuidas ümber tõsta suurt hulka faile/kaustu.
Süntaks
<argumendid> | xargs <võtmed> <käsk <võtmed>>
Põhilised võtmed
- -a <failinimi> - argumendid loetakse failist standard sisendi asemel
- -0 - määrab ära, et argumendid on eraldatud null karakteriga, vajalik selleks kui argument sisaldab tühikut või reavahetust
- -n <argumentide arv> - määrab maksimaalse argumentide arvu, mis antakse soovitud käsu sisendiks.
- -d <eraldaja> - võimalik määrata argumentide eraldaja käsitsi, vaikimisi tühik või reavahetus
- -p - küsib kinnitust iga käsu rea käivitamise kohta.
- -r - määrab ära, et käsku ei käivitata kui standard sisend on tühi, st sisaldab ainult tühikuid
- -t - enne käsu käivitamist, trükitakse käsu rida standard vea väljundisse
- -E <lõpu tähis> - võimalik määrata faili lõpu tähis, vajalik võtme -a kasutamisel
- -e<lõpu tähis> - võtme -E sünonüüm, pole POSIX ühilduv
- --help - kuvatakse käsu xargs abiinfo
- --version - trükib käsu xargs versiooni numbri
Sekundaarsed võtmed
- -I <asendus tekst>
- -i<asendus tekst>
- -L <ridade arv>
- -l<ridade arv>
- -s <maksimaalsete tähtede arv>
- --show-limits
- -x
- -P <maksimaalsete protsesside arv>
Rohkem infot - http://www.softpanorama.org/Tools/xargs.shtml
Näited
Argumentide väljastamine kolme kaupa
$ echo 1 2 3 4 5 6 7 8 | xargs -n 3 echo
või
$ echo 1 2 3 4 5 6 7 8 | xargs -n 3
echo on xargs vaikimisi käsk, seega ei ole tarvis määrata käsku.
-n 3 määrab, et käsu standard sisendi tulemust kuvatakse kolme kaupa
$ echo 1 2 3 4 5 6 7 8 | xargs -n 3
1 2 3
4 5 6
7 8
Määratud laiendiga failide kustutamine avatud kataloogis
$ find . -name *.log | xargs rm
find võtmete selgitus:
- . - otsitakse faile avatud kataloogis
- -name *.log - failid on mistahes nimega kuid laiendiga .log
Määratud laiendiga failide kustutamine avatud kataloogis, kus faili nimedes on tühikud või reavahetused
$ find . -name *.log -print0 | xargs -0 rm
find võtmete selgitus:
- . - otsitakse faile avatud kataloogis
- -name *.log - failid on mistahes nimega kuid laiendiga .log
- -print0 - leitud argumendid eraldatakse null karakteriga
xargs võtmete selgitus:
- -0 määrab, et käsu standard sisendi tulemust eraldaja ei ole tühik ega reavahetus vaid null karakter. Vajalik selleks, kui faili nimed sisaldavad tühikuid või reavahetusi.
Kõikide arvuti kasutajate kuvamine viie kaupa
cut -d: -f1 < /etc/passwd | sort | xargs -n 5
cut võtmete selgitus:
- -d: - välja eraldajaks on ":"
- -f1 - valitakse esimene väli
xargs võtmete selgitus:
- -n 5 - standard sisendi argumente kuvatakse viie kaupa
$ cut -d: -f1 < /etc/passwd | sort | xargs -n 5
avahi avahi-autoipd backup bin daemon
games gdm gnats hplip irc
kernoops libuuid list lp mail
man messagebus news nobody proxy
pulse root rtkit saned speech-dispatcher
sync sys syslog student usbmux
uucp www-data
Kõikide kaustas olevate peidetud failide ja kaustade ümbertõstmine
find . -path "./*" -name "[!.]*" -print0 | xargs -r0 mv --target="/mingi/teine/kataloog"
find võtmete selgitus:
- . - otsitakse hetkel avatud kaustast
- -path "./*" - määrab ära otsingu sügavuse, praegusel juhul ka alamfailid ja -kaustad
- -name "[!.]*" - määrab ära, et otsitakse punktiga algavaid faile ning kaustu
- -print0 - leitud argumendid eraldatakse null karakteriga
xargs võtmete selgitus:
- -r0' - r määrab ära, et käsku mv ei käivitata kui standard sisend on tühi ning 0 määrab standard sisendi eraldajaks null karakteri
mv võtmete selgitus:
- --target="/mingi/teine/kataloog" - kaustad ning failid tõstetakse ümber asukohta /mingi/teine/kataloog
Kokkuvõte
xargs vajadus tekkis kunagi Linuxi kerneli ARG_MAX parameetri tõttu, mis sätestas maksimaalsete argumentide hulga. Alates linux-2.6.23 kernelist on antud parameeter eemaldatud.
Kuid siiski on xargs senini kasulik töövahend, näiteks:
$ find -name "*~" -exec rm
sellise käsu käivitamisel luuakse iga faili kohta eraldi kustutamise protsess.
Kui aga:
$ find -name "*~" | xargs rm
siis ei käivitata iga kustutuse jaoks eraldi protsessi, vaid xargs kontrollib maksimaalsete argumentide hulka ning vastavalt sellele on ka käivitatud protsesside hulk väiksem.
Allikad/Allikad
- http://en.wikipedia.org/wiki/Xargs
- http://www.gnu.org/software/coreutils/faq/coreutils-faq.html#Argument-list-too-long
- http://www.cyberciti.biz/faq/linux-unix-bsd-xargs-construct-argument-lists-utility/
- http://www.linuxtutorialblog.com/post/tutorial-the-best-tips-tricks-for-bash
- http://www.softpanorama.org/Tools/xargs.shtml
Autor
Marko Valing, AK31, 2010/2011