Slik bruker du xargs-kommandoen på Linux

En Linux-terminalmelding på en bærbar datamaskin

Fatmawati Achmad Zaenuri/Shutterstock



Trenger du å sette noen Linux-kommandoer sammen, men en av dem godtar ikke inndata i rør? |_+_| kan ta utdata fra en kommando og sende den til en annen kommando som parametere.

Alle standard Linux-verktøy har tre datastrømmer knyttet til dem. De er standard input-stream (stdin), standard output stream (stdout) og standard error stream (stderr).





Disse strømmene jobber med tekst. Vi sender input (stdin) til en kommando ved hjelp av tekst, og svaret (stdout) skrives til terminalvinduet som tekst. Feilmeldinger skrives også til terminalvinduet som tekst (stderr).

En av de flotte funksjonene til Linux og Unix-lignende operativsystemer er muligheten til å overføre stdout-utgangen fra én kommando til stdin-inngangen til en andre kommando. Den første kommandoen bryr seg ikke om at utgangen ikke går til et terminalvindu, og den andre kommandoen bryr seg ikke om at inngangen ikke kommer fra et tastatur.



Selv om alle Linux-kommandoene har de tre standardstrømmene, godtar ikke alle en annen kommandos stdout som input til stdin. Det betyr at du ikke kan sende input til dem.

Annonse

|_+_| er en kommando for å bygge utførelsespipelines ved å bruke standard datastrømmer. Ved å bruke |_+_| vi kan lage kommandoer som |_+_|, |_+_| og |_+_| godta standard input som argumenter.

xargs-kommandoen

|_+_| vil godta inndata i rør. Den kan også godta inndata fra en fil. |_+_| bruker denne inngangen som parametere for kommandoene vi har bedt den om å fungere med. Hvis vi ikke forteller |_+_| for å jobbe med en spesifikk kommando vil den som standard bruke |_+_|.



Vi kan bruke det til å demonstrere hvordan |_+_| vil alltid generere en enkelt linje med utdata, selv fra multi-line input.

Hvis vi bruker |_+_| (liste én fil per linje) alternativ med |_+_|, får vi en enkelt kolonne med filnavn .

xargs

Dette viser shell-skriptfilene i gjeldende katalog.

Vi får en enkelt kolonne som forventet. Hvis vi piper det gjennom |_+_| hva får vi?

xargs

Annonse

Utdataene skrives til terminalvinduet, som én lang tekststrøm.

Det er denne evnen som lar oss |_+_| mate parametere inn i andre kommandoer.

Bruke xargs med wc

Vi kan bruke |_+_| å enkelt ha |_+_| telle ord, tegn og linjer i flere filer.

xargs

Dette er hva som skjer:

  • |_+_| viser *.page-filene og sender listen til |_+_|.
  • |_+_| sender filnavnene til |_+_|.
  • |_+_| behandler filnavnene som om den hadde mottatt dem som kommandolinjeparametere.

Statistikken for hver fil vises sammen med en totalsum.

Bruke xargs med bekreftelse

Vi kan bruke |_+_| (interaktivt) alternativ for å ha |_+_| be oss om å bekrefte at vi er glade for at det fortsetter.

Hvis vi sender en streng med filnavn til |_+_|, gjennom |_+_|, |_+_| vil opprette filene for oss.

echo

Annonse

Kommandoen som skal utføres vises og |_+_| venter på at vi skal svare ved å skrive y eller Y, eller n eller N, og trykke Enter.

Hvis du bare trykker Enter, behandles det som n. Kommandoen utføres bare hvis du skriver y eller Y.

Vi trykket y og trykket Enter. Vi kan bruke |_+_| for å kontrollere at filene er opprettet.

rm

Bruke xargs med flere kommandoer

Vi kan bruke flere kommandoer med |_+_| ved å bruke |_+_| (innledende argumenter) alternativ.

Dette alternativet definerer en erstatningsstreng. Uansett hvor tokenet for erstatningsstrengen vises på kommandolinjen, vil verdiene som ble oppgitt til |_+_| er satt inn.

La oss bruke |_+_| kommando for å se på underkatalogene fra gjeldende katalog. Den |_+_| (katalog)-alternativet forårsaker |_+_| å ignorere filer og bare rapportere om kataloger.

mkdir

Det er en enkelt underkatalog kalt bilder.

Annonse

I en fil kalt directories.txt har vi navnene på noen kataloger som vi ønsker å ha opprettet. Vi kan se på innholdet ved å bruke |_+_|.

xargs

Vi skal bruke dette som inngangsdata for |_+_|. Kommandoen vi skal til er denne:

xargs

Dette deler seg slik:

  • cat directories.txt | : Dette skyver innholdet i directories.txt-filen (alle de nye katalognavnene) inn i |_+_|.
  • xargs -I % : Dette definerer en erstatningsstreng med token %.
  • sh-c : Dette starter et nytt subshell. Den |_+_| (kommando) forteller skallet å lese kommandoer fra kommandolinjen.
  • 'ekko %; mkdir %' : hvert av %-tokenene vil bli erstattet av katalognavnene som sendes av |_+_|. Den |_+_| kommandoen vil skrive ut katalognavnet; den |_+_| kommandoen vil opprette katalogen.

Katalogene er listet opp én etter én.

Vi kan bruke |_+_| en gang til for å bekrefte at katalogene er opprettet.

xargs

Kopiere filer til flere steder

Vi kan bruke |_+_| for å tillate oss å kopiere filer til flere steder med en enkelt kommando.

Vi skal overføre navnene på to kataloger til |_+_| som inngangsparametere. Vi vil fortelle |_+_| å bare sende én av disse parameterne om gangen til kommandoen den jobber med.

I dette tilfellet er kommandoen |_+_|. Så effekten er å ringe |_+_| to ganger, hver gang med en av de to katalogene som kommandolinjeparameter. Den |_+_| parameteren som lar dette skje er |_+_| (maks antall) alternativ. Vi skal sette dette til å være en.

Annonse

Vi bruker også |_+_| (verbose) alternativ med |_+_| slik at den rapporterer hva som skjer.

echo

Filene kopieres til de to katalogene, en katalog om gangen. |_+_| rapporterer hver filkopieringshandling slik at vi kan se dem finne sted.

Slette filer i nestede kataloger

Hvis filnavn har mellomrom og merkelige tegn – slik som nylinjetegn – |_+_| vil ikke kunne tolke dem riktig. Vi kan løse dette problemet ved å bruke alternativet -0 (nullterminator). Dette forteller |_+_| å bruke null-tegnet som siste skilletegn for filnavn.

Vi skal bruke |_+_| i dette eksemplet. |_+_| har sin egen mulighet for håndtere mellomrom og merkelige tegn i filnavn. Det er |_+_| (fullt navn, nulltegn) alternativ.

xargs

Dette deler seg slik:

  • finne. -navn *.png : |_+_| skal søke fra gjeldende katalog. for objekter med navn som samsvarer med *.png som er filer (|_+_|).
  • -trykk0 : navn vil bli avsluttet med et nulltegn, og mellomrom og merkelige tegn vil bli tatt hensyn til.
  • xargs -0 : xargs kommer også til å vurdere filnavn som null-terminerte, og mellomrom og merkelige tegn vil ikke forårsake problemer.
  • rm -v -rf {} : rm kommer til å være detaljert og rapportere hva som skjer (|_+_|). Det kommer til å være rekursivt (-r) og se gjennom nestede underkataloger, og vil fjerne filer uten å spørre (|_+_|). {} erstattes av hvert filnavn.

Alle underkataloger søkes, og filene som samsvarer med søkemønsteret slettes.

Fjerner nestede kataloger

La oss si at vi vil fjerne et sett med nestede underkataloger. |_+_| vil la oss se dem.

-1

lsAnnonse

Denne kommandoen vil bruke finn for å søke rekursivt i gjeldende katalog. Søkemålet er en katalog kalt level_one. Katalognavnene sendes gjennom |_+_| til |_+_|.

De eneste vesentlige endringene mellom denne kommandoen og den forrige kommandoen er, søkeordet er navnet på den øverste katalogen, og |_+_| forteller |_+_| å se etter kataloger, ikke filer.

Navnet på hver katalog skrives ut etter hvert som den fjernes. Vi kan sjekke med |_+_| :

xargs

Alle de nestede underkatalogene blir slettet.

Sletter alle filer, bortsett fra én filtype

Vi kan bruke |_+_|, |_+_| og |_+_| for å slette alle filer bortsett fra én type vi ønsker å beholde. Det er litt motintuitivt, men vi oppgir navnet på filtypen vi ønsker beholde , ikke navnet på de vi ønsker å slette.

Den |_+_| alternativet forteller |_+_| for å returnere navnene på filene som ikke samsvarer med søkemønsteret. Vi bruker |_+_| (initielle argumenter) alternativ med |_+_| en gang til. Denne gangen er erstatningsstreng-tokenet vi definerer {}. Dette vil oppføre seg nøyaktig på samme måte som erstatningsstreng-tokenet vi genererte tidligere, som tilfeldigvis var en %.

xargs

Vi kan sjekke med |_+_|. De eneste filene som er igjen i katalogen er de som samsvarte med *.sh-søkemønsteret.

xargs

Opprette en arkivfil med Xargs

Vi kan bruke |_+_| for å søke etter filer og sende dem gjennom |_+_| til |_+_|, for å lage en arkivfil.

Annonse

Vi skal søke i gjeldende katalog. Søkemønsteret er *.page, så vi skal lete etter .page-filer.

wc

Filene er oppført som forventet, ettersom arkivfilen opprettes.

Dataformidleren

Noen ganger trenger du litt stillas når du stabler ting sammen. |_+_| bygger bro mellom kommandoer som kan pumpe ut informasjon og kommandoer som ikke er bygd for å ta den inn.

Begge |_+_| og |_+_| har et stort antall alternativer. Du oppfordres til å sjekke man-sidene deres for å lære mer.

Linux-kommandoer
Filer tjære · pv · katt · tac · chmod · grep · diff · sed · Med · Mann · pushd · popd · fsck · testdisk · seq · fd · pandoc · CD · $PATH · awk · bli med · jq · brette · unik · journalctl · hale · stat · ls · fstab · kastet ut · mindre · chgrp · chown · rev · se · strenger · type · endre navn · glidelås · pakke opp · montere · umount · installere · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · fra · ln · lapp · konvertere · rclone · makulere · SRM
Prosesser alias · skjerm · topp · hyggelig · renice · framgang · strace · system · tmux · chsh · historie · · parti · gratis · hvilken · dmesg · brukermod · ps · chroot · xargs · tty · rosa · lsof · vmstat · pause · vegg · ja · drepe · søvn · sudo · hans · tid · gruppeadd · brukermod · grupper · lshw · skru av · starte på nytt · Stoppe · strøm av · passwd · lscpu · crontab · Dato · bg · fg
Nettverk netstat · ping · traceroute · ip · ss · hvem er · fail2ban · bmon · du · finger · nmap · ftp · krølle · wget · hvem · hvem er jeg · I · iptables · ssh-keygen · ufw

I SLEKT: Beste Linux bærbare datamaskiner for utviklere og entusiaster

LES NESTE Profilbilde for Dave McKay Dave McKay
Dave McKay brukte først datamaskiner da stanset papirtape var på moten, og han har programmert siden. Etter over 30 år i IT-bransjen er han nå teknologijournalist på heltid. I løpet av sin karriere har han jobbet som frilansprogrammerer, leder for et internasjonalt programvareutviklingsteam, prosjektleder for IT-tjenester og sist som databeskyttelsesansvarlig. Hans forfatterskap har blitt publisert av howtogeek.com, cloudsavvyit.com, itenterpriser.com og opensource.com. Dave er en Linux-evangelist og forkjemper for åpen kildekode.
Les hele bio

Interessante Artikler