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ënxargs
.xargs
ia kalon emrat e skedarëvewc
.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
. Komandaecho
do të printojë emrin e drejtorisë; komandamkdir
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 xargs
në rm
.
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ë.
Linux Commands | ||
Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc | |
Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap | |
Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
RELATED: Best Linux Laptops for Developers and Enthusiasts