Sådan bruges xargs-kommandoen på Linux

Har du brug for at sætte nogle Linux-kommandoer sammen, men en af ​​dem accepterer ikke pipeline-input? xargs kan tage output fra én kommando og sende det til en anden kommando som parametre.

Alle standard Linux-værktøjer har tre datastrømme forbundet med dem. De er standardinputstrømmen (stdin), standardoutputstrømmen (stdout) og standardfejlstrømmen (stderr).

Disse streams arbejder med tekst. Vi sender input (stdin) til en kommando ved hjælp af tekst, og svaret (stdout) skrives til terminalvinduet som tekst. Fejlmeddelelser skrives også til terminalvinduet som tekst (stderr).

En af de fantastiske funktioner ved Linux og Unix-lignende operativsystemer er evnen til at overføre stdout-outputtet fra én kommando til stdin-inputtet på en anden kommando. Den første kommando er ligeglad med, at dens output ikke går til et terminalvindue, og den anden kommando er ligeglad med, at dens input ikke kommer fra et tastatur.

Selvom alle Linux-kommandoer har de tre standard-streams, accepterer de ikke alle en anden kommandos stdout som input til deres stdin. Det betyder, at du ikke kan sende input til dem.

xargs er en kommando til at bygge udførelsespipelines ved hjælp af standard datastrømme. Ved at bruge xargs kan vi få kommandoer som echo, rm og mkdir til at acceptere standard input som argumenter.

xargs-kommandoen

xargs vil acceptere piped input. Den kan også acceptere input fra en fil. xargs bruger det input som parametre for de kommandoer, vi har bedt det om at arbejde med. Hvis vi ikke fortæller xargs at arbejde med en specifik kommando, vil den som standard bruge ekko.

Vi kan bruge det til at demonstrere, hvordan xargs altid vil generere en enkelt linje af output, selv fra multi-line input.

Hvis vi bruger muligheden -1 (liste én fil pr. linje) med ls, får vi en enkelt kolonne med filnavne.

ls -1 ./*.sh

Dette viser shell-script-filerne i den aktuelle mappe.

Vi får en enkelt kolonne som forventet. Hvis vi rører det igennem xargs, hvad får vi?

ls -1 ./*.sh | xargs

Outputtet skrives til terminalvinduet som én lang tekststrøm.

  Sådan finder du sangtekster på Linux med Lyrics Finder

Det er denne evne, der lader os xargs feed parametre ind i andre kommandoer.

Brug af xargs med wc

Vi kan bruge xargs til nemt at få wc til at tælle ord, tegn og linjer i flere filer.

ls *.page | xargs wc

Dette er hvad der sker:

ls viser *.page-filerne og sender listen til xargs.
xargs sender filnavnene til wc.
wc behandler filnavnene, som om det havde modtaget dem som kommandolinjeparametre.

Statistikken for hver fil vises sammen med en samlet total.

Brug af xargs med bekræftelse

Vi kan bruge -p (interaktiv) mulighed for at få xargs til at bede os om at bekræfte, at vi er glade for, at det fortsætter.

Hvis vi sender en række filnavne til at røre ved, gennem xargs, vil berøring oprette filerne for os.

echo 'one two three' | xargs -p touch

Kommandoen, der skal udføres, vises, og xargs venter på, at vi svarer ved at skrive “y” eller “Y”, eller “n” eller “N”, og trykke på Enter.

Hvis du bare trykker på Enter, behandles det som “n”. Kommandoen udføres kun, hvis du skriver “y” eller “Y”.

Vi trykkede “y” og trykkede Enter. Vi kan bruge ls til at kontrollere, at filerne er blevet oprettet.

ls one two three

Brug af xargs med flere kommandoer

Vi kan bruge flere kommandoer med xargs ved at bruge -I (indledende argumenter) mulighed.

Denne indstilling definerer en “erstat-streng.” Hvor som helst tokenet for erstatningsstrengen vises på kommandolinjen, indsættes de værdier, der blev leveret til xargs.

Lad os bruge trækommandoen til at se på undermapperne fra den aktuelle mappe. Indstillingen -d (mappe) får træet til at ignorere filer og kun rapportere om mapper.

tree -d

Der er en enkelt undermappe kaldet “billeder”.

I en fil kaldet “directories.txt”, har vi navnene på nogle mapper, som vi ønsker at have oprettet. Vi kan se på dens indhold ved hjælp af kat.

cat directories.txt

Vi vil bruge dette som inputdata for xargs. Kommandoen vi skal til er denne:

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

Dette fordeler sig sådan her:

cat directories.txt |: Dette skubber indholdet af directories.txt-filen (alle de nye mappenavne) ind i xargs.
xargs -I %: Dette definerer en “erstat-streng” med tokenet “%”.
sh -c: Dette starter en ny subshell. -c (kommando) fortæller skallen at læse kommandoer fra kommandolinjen.
‘ekko %; mkdir %’: hver af “%” tokens vil blive erstattet af de mappenavne, der sendes af xargs. Ekko-kommandoen udskriver mappenavnet; mkdir-kommandoen vil oprette mappen.

  Sådan spiller du Trine 3 på Linux

Telefonbøgerne er listet én efter én.

Vi kan bruge træet igen til at bekræfte, at mapperne er blevet oprettet.

tree -d

Kopiering af filer til flere lokationer

Vi kan bruge xargs til at tillade os at kopiere filer til flere steder med en enkelt kommando.

Vi vil overføre navnene på to mapper til xargs som inputparametre. Vi fortæller xargs kun at videregive en af ​​disse parametre ad gangen til den kommando, den arbejder med.

I dette tilfælde er kommandoen cp. Så effekten er at kalde cp to gange, hver gang med en af ​​de to mapper som kommandolinjeparameter. Xargs-parameteren, der tillader dette at ske, er muligheden -n (maks. antal). Vi vil indstille dette til at være en.

Vi bruger også muligheden -v (verbose) med cp, så den rapporterer, hvad der sker.

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

Filerne kopieres til de to mapper, en mappe ad gangen. cp rapporterer hver filkopieringshandling, så vi kan se dem finde sted.

Sletning af filer i indlejrede mapper

Hvis filnavne har mellemrum og mærkelige tegn i dem – såsom nye linjetegn – vil xargs ikke være i stand til at fortolke dem korrekt. Vi kan overvinde dette problem ved at bruge -0 (nul terminator) mulighed. Dette fortæller xargs at bruge null-tegnet som den endelige afgrænsning for filnavne.

Vi skal bruge find i dette eksempel. find har sin egen mulighed for beskæftiger sig med mellemrum og mærkelige tegn i filnavne. Det er muligheden -print0 (fuldt navn, nultegn).

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

Dette fordeler sig sådan her:

finde . -navn “*.png”: find vil søge fra den aktuelle mappe “.” for objekter med navne, der matcher “*.png”, som er filer (type -f).
-print0: navne vil blive afsluttet med et nul-tegn, og mellemrum og mærkelige tegn vil blive taget hensyn til.
xargs -0: xargs vil også betragte filnavne som null-terminerede, og mellemrum og mærkelige tegn vil ikke forårsage problemer.
rm -v -rf “{}”: rm vil være udførlig og rapportere, hvad der sker (-v). Det vil være rekursivt (-r) og se gennem indlejrede undermapper og vil fjerne filer uden at spørge (-f). “{}” erstattes af hvert filnavn.

  Sådan installeres og konfigureres Plex Media Server på Linux

finde .  -navn

Der søges i alle undermapper, og de filer, der matcher søgemønsteret, slettes.

Fjernelse af indlejrede mapper

Lad os sige, at vi ønsker at fjerne et sæt indlejrede undermapper. træet vil lade os se dem.

tree -d

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

Denne kommando vil bruge find til at søge rekursivt i den aktuelle mappe. Søgemålet er en mappe kaldet “level_one”. Biblioteksnavnene sendes gennem xargs til rm.

finde .  -navn

De eneste væsentlige ændringer mellem denne kommando og den forrige kommando er, at søgeordet er navnet på den øverste mappe, og -type d fortæller find at søge efter mapper, ikke filer.

Navnet på hver mappe udskrives, efterhånden som den fjernes. Vi kan tjekke med træ:

tree -d

Alle de indlejrede undermapper slettes.

Sletning af alle filer undtagen én filtype

Vi kan bruge find, xargs og rm til at slette alle filer bortset fra én type, vi ønsker at beholde. Det er lidt kontraintuitivt, men vi angiver navnet på den filtype, vi ønsker at beholde, ikke navnet på dem, vi ønsker at slette.

Indstillingen -not fortæller find at returnere navnene på de filer, der ikke matcher søgemønsteret. Vi bruger muligheden -I (indledende argumenter) med xargs endnu en gang. Denne gang er det erstatningsstreng-token, vi definerer, “{}”. Dette vil opføre sig nøjagtigt det samme som det erstatningsstreng-token, vi genererede tidligere, som tilfældigvis var en “%”.

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

finde .  -type f -ikke - navn

Vi kan tjekke med ls. De eneste filer tilbage i mappen er dem, der matchede “*.sh” søgemønsteret.

ls -l

Oprettelse af en arkivfil med Xargs

Vi kan bruge find til at søge efter filer og sende dem gennem xargs til tar, for at oprette en arkivfil.

Vi vil søge i den aktuelle mappe. Søgemønsteret er “*.page”, så vi leder efter “.page”-filer.

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

find ./ - navn

Filerne vises som forventet, efterhånden som arkivfilen oprettes.

Datamægleren

Nogle gange har man brug for et lille stillads, når man stabler ting sammen. xargs bygger bro mellem kommandoer, der kan pumpe information ud, og kommandoer, der ikke er bygget til at tage den ind.

Både xargs og find har et stort antal muligheder. Du opfordres til at tjekke deres man-sider for at lære mere.