Si të përdorni komandën xargs në Linux


Duhet të lidhni disa komanda Linux së bashku, por njëra prej tyre nuk pranon hyrjen me tubacion? xargs mund të marrë daljen nga një komandë dhe ta dërgojë atë në një komandë tjetër si parametra.

Të gjitha shërbimet standarde të Linux kanë tre rrjedha të dhënash të lidhura me to. Ato janë rrjedha standarde e hyrjes (stdin), rrjedha standarde e daljes (stdout) dhe rrjedha standarde e gabimit (stderr).

Këto transmetime funksionojnë me tekst. Ne dërgojmë hyrjen (stdin) në një komandë duke përdorur tekst, dhe përgjigja (stdout) shkruhet në dritaren e terminalit si tekst. Mesazhet e gabimit shkruhen gjithashtu në dritaren e terminalit si tekst (stderr).

Një nga veçoritë e shkëlqyera të sistemeve operative Linux dhe Unix-it është aftësia për të futur daljen stdout nga një komandë në hyrjen stdin të një komande të dytë. Komandës së parë nuk i intereson që dalja e saj të mos shkojë në një dritare terminali, dhe komanda e dytë nuk kujdeset që hyrja e saj të mos vijë nga një tastierë.

Megjithëse të gjitha komandat Linux kanë tre rrjedhat standarde, jo të gjitha pranojnë stdout të një komande tjetër si hyrje në stdin e tyre. Kjo do të thotë që ju nuk mund të dërgoni hyrje në to.

xargs është një komandë për ndërtimin e tubacioneve të ekzekutimit duke përdorur rrjedhat standarde të të dhënave. Duke përdorur xargs ne mund të bëjmë komanda të tilla si echo, rm dhe mkdir të pranojnë hyrjen standarde si argumente.

Komanda xargs

xargs do të pranojë hyrjen me tubacion. Mund të pranojë gjithashtu të dhëna nga një skedar. xargs e përdor atë hyrje si parametra për komandat me të cilat i kemi thënë të punojë. Nëse nuk i themi xargs të punojë me një komandë specifike, ai do të përdorë si parazgjedhje echo.

Ne mund ta përdorim atë për të demonstruar se si xargs do të gjenerojë gjithmonë një linjë të vetme daljeje, madje edhe nga hyrja me shumë rreshta.

Nëse përdorim opsionin -1 (listoni një skedar për rresht) me ls, marrim një kolonë të vetme emrash skedarësh.

ls -1 ./*.sh

Kjo rendit skedarët e skriptit të guaskës në drejtorinë aktuale.

Ne marrim një kolonë të vetme siç pritej. Nëse e kalojmë përmes xargs çfarë fitojmë?

ls -1 ./*.sh | xargs

Dalja shkruhet në dritaren e terminalit, si një rrjedhë e gjatë teksti.

Është kjo aftësi që le të xargs ushqejmë parametrat në komanda të tjera.

Përdorimi i xargs me wc

Ne mund të përdorim xargs për të mundësuar që wc të numërojë me lehtësi fjalët, karakteret dhe rreshtat në skedarë të shumtë.

ls *.page | xargs wc

Kjo është ajo që ndodh:

  • ls liston skedarët *.page dhe ia kalon listën xargs.
  • xargs ia kalon emrat e skedarëve wc.
  • wc i trajton emrat e skedarëve sikur t'i kishte marrë si parametra të linjës së komandës.

Statistikat për çdo skedar shfaqen së bashku me një total të përgjithshëm.

Përdorimi i xargs me konfirmim

Ne mund të përdorim opsionin -p (interaktiv) që xargs të na kërkojë të konfirmojmë se jemi të lumtur që ajo të vazhdojë.

Nëse kalojmë një varg emrash skedarësh për të prek, përmes xargs, touch do të krijojë skedarët për ne.

echo 'one two three' | xargs -p touch

Shfaqet komanda që do të ekzekutohet dhe xargs pret që ne të përgjigjemi duke shtypur y ose Y, ose n ose N dhe duke shtypur Enter.

Nëse thjesht shtypni Enter, ai trajtohet si n. Komanda ekzekutohet vetëm nëse shkruani y ose Y.

Shtypëm y dhe shtypëm Enter. Mund të përdorim ls për të kontrolluar nëse skedarët janë krijuar.

ls one two three

Përdorimi i xargs me komanda të shumta

Ne mund të përdorim komanda të shumta me xargs duke përdorur opsionin -I (argumentet fillestare).

Ky opsion përcakton një varg zëvendësimi. Kudo ku shfaqet shenja për vargun zëvendësues në vijën e komandës, futen vlerat që i janë dhënë xargs.

Le të përdorim komandën pema për të parë nëndirektoritë nga drejtoria aktuale. Opsioni -d (directory) bën që pema të injorojë skedarët dhe të raportojë vetëm për drejtoritë.

tree -d

Ekziston një nëndrejtori e vetme e quajtur imazhe.

Në një skedar të quajtur directories.txt, ne kemi emrat e disa drejtorive që dëshirojmë të kemi krijuar. Ne mund të shikojmë përmbajtjen e tij duke përdorur cat.

cat directories.txt

Ne do ta përdorim këtë si të dhëna hyrëse për xargs. Komanda që do të bëjmë është kjo:

cat directories.txt | xargs -I % sh -c 'echo %; mkdir %'

Kjo zbërthehet kështu:

  • cat directories.txt |: Kjo shtyn përmbajtjen e  skedarit directrories.txt (të gjithë emrat e drejtorive të reja) në xargs.
  • xargs -I %: Kjo përcakton një zëvendësim-string me shenjën %.
  • sh -c: Kjo fillon një nënshell të ri. -c (komandë) i thotë shell-it të lexojë komandat nga linja e komandës.
  • ‘echo %; mkdir %’: secili prej shenjave “%” do të zëvendësohet nga emrat e drejtorive që kalohen nga  xargs. Komanda echo do të printojë emrin e drejtorisë; komanda mkdir do të krijojë drejtorinë.

Drejtoritë janë renditur një nga një.

Mund të përdorim edhe një herë pema për të verifikuar se janë krijuar drejtoritë.

tree -d

Kopjimi i skedarëve në shumë vendndodhje

Ne mund të përdorim xargs për të na lejuar të kopjojmë skedarë në shumë vende me një komandë të vetme.

Ne do të vendosim emrat e dy drejtorive në xargs si parametrat hyrës. Ne do t'i themi xargs që të kalojë vetëm një nga këta parametra në të njëjtën kohë në komandën me të cilën po punon.

Në këtë rast, komanda është cp. Pra, efekti është që të thirret cp dy herë, çdo herë me një nga dy drejtoritë si një parametër i linjës së komandës. Parametri xargs që e lejon këtë të ndodhë është opsioni -n (numri maksimal). Ne do ta vendosim këtë të jetë një.

Ne po përdorim gjithashtu opsionin -v (me fjalë) me cp në mënyrë që të raportojë se çfarë po ndodh.

echo ~/Backups/ ~/Documents/page-files/ | xargs -n 1 cp -v ./*.page

Skedarët kopjohen në dy drejtori, një direktori në të njëjtën kohë. cp raporton çdo veprim të kopjimit të skedarit në mënyrë që ne t'i shohim ato duke u kryer.

Fshirja e skedarëve në drejtoritë e ndërlidhura

Nëse emrat e skedarëve kanë hapësira dhe karaktere të çuditshme në to—si p.sh. karakteret e linjës së re— xargs nuk do të jetë në gjendje t'i interpretojë ato siç duhet. Ne mund ta kapërcejmë atë problem duke përdorur opsionin -0 (terminator null). Kjo i thotë xargs të përdorë karakterin null si ndarës përfundimtar për emrat e skedarëve.

Ne do të përdorim gjeni në këtë shembull. find ka opsionin e vet për trajtimin e hapësirës së bardhë dhe karaktereve të çuditshme në emrat e skedarëve. Është opsioni -print0 (emri i plotë, karakteri null).

find . -name "*.png" -type f -print0 | xargs -0 rm -v -rf "{}"

Kjo zbërthehet kështu:

  • gjeni . -name *.png: find do të kërkojë nga drejtoria aktuale . për objektet me emra që përputhen me “*.png” që janë skedarë (type -f).
  • -print0: emrat do të mbyllen me një karakter të pavlefshëm dhe do të kujdesen për hapësirat dhe karakteret e çuditshme.
  • xargs -0: xargs gjithashtu do t'i konsiderojë emrat e skedarëve si të pavlefshëm dhe hapësirat dhe karakteret e çuditshme nuk do të shkaktojnë probleme.
  • rm -v -rf {}: rm do të jetë e folur dhe do të raportojë se çfarë po ndodh (-v). Ai do të jetë rekurziv (-r) dhe do të shikojë nëpër nëndrejtori të ndërlidhura dhe do të heqë skedarët pa kërkuar (-f). {} zëvendësohet nga çdo emër skedari.

Kërkohen të gjitha nëndrejtoritë dhe skedarët që përputhen me modelin e kërkimit fshihen.

Heqja e drejtorive të ndërlidhura

Le të themi se duam të heqim një grup nëndrejtorish të mbivendosur. pema do të na lejojë t'i shohim ato.

tree -d
find . -name "level_one" -type d printo | xargs -o rm -v -rf "{}"

Kjo komandë do të përdorë find për të kërkuar në mënyrë rekursive brenda drejtorisë aktuale. Objektivi i kërkimit është një direktori e quajtur niveli_one. Emrat e drejtorive kalohen nga xargsrm.

Ndryshimet e vetme të rëndësishme midis kësaj komande dhe komandës së mëparshme janë, termi i kërkimit është emri i drejtorisë më të lartë dhe -type d i thotë find të kërkojë drejtoritë, jo dosjet.

Emri i çdo drejtorie shtypet pasi hiqet. Mund të kontrollojmë me pemë:

tree -d

Të gjitha nëndrejtoritë e mbivendosur janë fshirë.

Fshirja e të gjithë skedarëve, përveç një lloji skedari

Ne mund të përdorim find, xargs dhe rm për të fshirë të gjithë skedarët, përveç një lloji që duam të ruajmë. Është paksa kundërintuitive, por ne japim emrin e llojit të skedarit që dëshirojmë të mbajmë, jo emrin e atyre që duam të fshijmë.

Opsioni -not i thotë find të kthejë emrat e skedarëve që nuk përputhen me modelin e kërkimit. Ne po përdorim edhe një herë opsionin -I (argumentet fillestare) me xargs. Këtë herë token-vargu zëvendësues që po përcaktojmë është {}. Kjo do të sillet saktësisht njësoj si shenja zëvendësuese e vargut që kemi krijuar më parë, e cila ka ndodhur të jetë një %.

find . -type f -not - name "*.sh" -print0 | xargs -0 -I {} rm -v {}

Mund të kontrollojmë me ls. Të vetmit skedarë të mbetur në drejtori janë ato që përputhen me modelin e kërkimit *.sh.

ls -l

Krijimi i një skedari arkivi me Xargs

Ne mund të përdorim find për të kërkuar skedarë dhe për t'i kaluar ato përmes  xargs  në tar, për të krijuar një skedar arkiv.

Ne do të kërkojmë në drejtorinë aktuale. Modeli i kërkimit është *.page kështu që ne do të kërkojmë skedarët .page.

find ./ - name "*.page" -type f -print0 | xargs -0 -tar -cvzf page_files.tar.gz

Skedarët renditen siç pritej, pasi krijohet skedari i arkivit.

Ndërmjetësi i të Dhënave

Ndonjëherë keni nevojë për një skelë të vogël kur i grumbulloni gjërat së bashku. xargs lidh hendekun midis komandave që mund të nxjerrin informacion dhe komandave që nuk janë krijuar për ta pranuar atë.

Të dy xargs dhe find kanë një numër të madh opsionesh. Jeni të inkurajuar të shikoni faqet e tyre për të mësuar më shumë.

RELATED: Best Linux Laptops for Developers and Enthusiasts