Slik bruker du xargs-kommandoen på Linux

Trenger du å sette noen Linux-kommandoer sammen, men en av dem godtar ikke inndata i rør? xargs kan ta utdata fra én 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 dens utdata ikke går til et terminalvindu, og den andre kommandoen bryr seg ikke om at input 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.

xargs er en kommando for å bygge utførelsespipelines ved å bruke standard datastrømmer. Ved å bruke xargs kan vi få kommandoer som echo, rm og mkdir til å akseptere standard input som argumenter.

xargs-kommandoen

xargs vil akseptere rørledning. Den kan også godta inndata fra en fil. xargs bruker denne inngangen som parametere for kommandoene vi har bedt den om å fungere med. Hvis vi ikke forteller xargs å jobbe med en spesifikk kommando, vil den som standard bruke ekko.

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

Hvis vi bruker alternativet -1 (liste én fil per linje) med ls, får vi en enkelt kolonne med filnavn.

ls -1 ./*.sh

Dette viser shell-skriptfilene i gjeldende katalog.

Vi får en enkelt kolonne som forventet. Hva får vi hvis vi rører det gjennom xargs?

ls -1 ./*.sh | xargs

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

  Hvordan spille Yooka-Laylee på Linux

Det er denne evnen som lar oss xargs mate parametere inn i andre kommandoer.

Bruke xargs med wc

Vi kan bruke xargs for enkelt å få wc til å telle ord, tegn og linjer i flere filer.

ls *.page | xargs wc

Dette er hva som skjer:

ls viser *.page-filene og sender listen til xargs.
xargs sender filnavnene til wc.
wc 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 alternativet -p (interaktivt) for å få xargs til å be oss om bekreftelse på at vi er glade for at det fortsetter.

Hvis vi sender en streng med filnavn å berøre, gjennom xargs, vil berøring opprette filene for oss.

echo 'one two three' | xargs -p touch

Kommandoen som skal utføres vises og xargs 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 på Enter. Vi kan bruke ls for å sjekke at filene er opprettet.

ls one two three

Bruke xargs med flere kommandoer

Vi kan bruke flere kommandoer med xargs ved å bruke alternativet -I (initielle argumenter).

Dette alternativet definerer en «erstatt-streng.» Uansett hvor tokenet for erstatningsstrengen vises på kommandolinjen, settes verdiene som ble levert til xargs inn.

La oss bruke trekommandoen til å se på underkatalogene fra gjeldende katalog. Alternativet -d (katalog) får treet til å ignorere filer og bare rapportere om kataloger.

tree -d

Det er en enkelt underkatalog kalt «bilder.»

I en fil kalt «directory.txt», har vi navnene på noen kataloger som vi ønsker å ha opprettet. Vi kan se på innholdet ved hjelp av katt.

cat directories.txt

Vi skal bruke dette som inndata for xargs. Kommandoen vi skal til er denne:

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

Dette deler seg slik:

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

  Hvordan installere Pgadmin på Linux

Katalogene er listet opp én etter én.

Vi kan bruke tree en gang til for å bekrefte at katalogene er opprettet.

tree -d

Kopiere filer til flere steder

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

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

I dette tilfellet er kommandoen cp. Så effekten er å kalle cp to ganger, hver gang med en av de to katalogene som en kommandolinjeparameter. Xargs-parameteren som lar dette skje er alternativet -n (maks. antall). Vi skal sette dette til å bli en.

Vi bruker også alternativet -v (verbose) med cp slik at det rapporterer hva som skjer.

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

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

Slette filer i nestede kataloger

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

Vi skal bruke finne i dette eksemplet. finne har sitt eget alternativ for håndtere mellomrom og merkelige tegn i filnavn. Det er alternativet -print0 (fullt navn, nulltegn).

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

Dette deler seg slik:

finne. -navn «*.png»: find kommer til å søke fra gjeldende katalog «.» for objekter med navn som samsvarer med «*.png» som er filer (type -f).
-print0: navn vil bli avsluttet med et null-tegn, 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 (-v). Det kommer til å være rekursivt (-r) og se gjennom nestede underkataloger, og vil fjerne filer uten å spørre (-f). «{}» erstattes av hvert filnavn.

  Hvordan sette et Bash-skript på pause med Linux Sleep-kommandoen

finne.  -Navn

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

Fjerner nestede kataloger

La oss si at vi ønsker å fjerne et sett med nestede underkataloger. treet lar oss se dem.

tree -d

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

Denne kommandoen vil bruke finn for å søke rekursivt i gjeldende katalog. Søkemålet er en katalog kalt «level_one». Katalognavnene sendes gjennom xargs til rm.

finne.  -Navn

De eneste vesentlige endringene mellom denne kommandoen og den forrige kommandoen er at søkeordet er navnet på den øverste katalogen, og -type d forteller find å se etter kataloger, ikke filer.

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

tree -d

Alle de nestede underkatalogene blir slettet.

Sletter alle filer, bortsett fra én filtype

Vi kan bruke find, xargs og rm for å slette alle filer bortsett fra en type vi ønsker å beholde. Det er litt motintuitivt, men vi oppgir navnet på filtypen vi ønsker å beholde, ikke navnet på de vi ønsker å slette.

Alternativet -not ber find returnere navnene på filene som ikke samsvarer med søkemønsteret. Vi bruker alternativet -I (initielle argumenter) med xargs en gang til. Denne gangen er erstatningsstreng-tokenet vi definerer «{}». Dette vil oppføre seg nøyaktig det samme som erstatnings-streng-tokenet vi genererte tidligere, som tilfeldigvis var en «%».

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

finne.  -type f -ikke - navn

Vi kan sjekke med ls. De eneste filene som er igjen i katalogen er de som samsvarte med «*.sh»-søkemønsteret.

ls -l

Opprette en arkivfil med Xargs

Vi kan bruke find for å søke etter filer og sende dem gjennom xargs til tar, for å lage en arkivfil.

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

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

finn ./ - navn

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

Dataformidleren

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

Både xargs og finne har et stort antall alternativer. Du oppfordres til å sjekke man-sidene deres for å lære mer.