Cum să utilizați comanda xargs pe Linux

Trebuie să încordați câteva comenzi Linux, dar una dintre ele nu acceptă introducerea prin canalizare? xargs poate prelua ieșirea de la o comandă și o poate trimite la o altă comandă ca parametri.

Toate utilitarele standard Linux au trei fluxuri de date asociate cu acestea. Acestea sunt fluxul de intrare standard (stdin), fluxul de ieșire standard (stdout) și fluxul de erori standard (stderr).

Aceste fluxuri funcționează cu text. Trimitem intrare (stdin) unei comenzi folosind text, iar răspunsul (stdout) este scris în fereastra terminalului ca text. Mesajele de eroare sunt, de asemenea, scrise în fereastra terminalului ca text (stderr).

Una dintre caracteristicile grozave ale sistemelor de operare Linux și Unix este capacitatea de a canaliza ieșirea stdout de la o comandă în intrarea stdin a unei a doua comenzi. Prima comandă nu-i pasă că ieșirea sa nu va ajunge la o fereastră de terminal, iar celei de-a doua comandă nu-i pasă că intrarea sa nu vine de la o tastatură.

Deși toate comenzile Linux au cele trei fluxuri standard, nu toate acceptă stdout-ul unei alte comenzi ca intrare în stdin-ul lor. Asta înseamnă că nu poți trimite intrarea către ele.

xargs este o comandă pentru construirea conductelor de execuție folosind fluxurile de date standard. Folosind xargs, putem face ca comenzi precum echo, rm și mkdir să accepte intrarea standard ca argumente.

Comanda xargs

xargs va accepta intrare prin conducte. De asemenea, poate accepta intrare dintr-un fișier. xargs folosește acea intrare ca parametri pentru comenzile cu care i-am spus să lucreze. Dacă nu îi spunem xargs să lucreze cu o anumită comandă, implicit va folosi echo.

Putem folosi asta pentru a demonstra cum xargs va genera întotdeauna o singură linie de ieșire, chiar și de la intrare pe mai multe linii.

Dacă folosim opțiunea -1 (lista un fișier pe linie) cu ls, obținem a o singură coloană de nume de fișiere.

ls -1 ./*.sh

Aceasta listează fișierele script shell din directorul curent.

Primim o singură coloană așa cum era de așteptat. Dacă îl ținem prin xargs, ce obținem?

ls -1 ./*.sh | xargs

Ieșirea este scrisă în fereastra terminalului, ca un flux lung de text.

  Cum se instalează Discord pe Linux

Această capacitate este cea care să introducem parametrii în alte comenzi.

Utilizarea xargs Cu wc

Putem folosi xargs pentru ca wc să conteze cu ușurință cuvinte, personaje și rânduri în mai multe fișiere.

ls *.page | xargs wc

Asta se intampla:

ls listează fișierele *.page și transmite lista către xargs.
xargs transmite numele fișierelor către wc.
wc tratează numele fișierelor ca și cum le-ar fi primit ca parametri de linie de comandă.

Statisticile pentru fiecare fișier sunt afișate împreună cu un total total.

Utilizarea xargs cu confirmare

Putem folosi opțiunea -p (interactivă) pentru ca xargs să ne solicite confirmarea că suntem fericiți să continue.

Dacă trecem un șir de nume de fișiere pentru a atinge, prin xargs, atingeți va creați fișierele pentru noi.

echo 'one two three' | xargs -p touch

Comanda care urmează să fie executată este afișată și xargs așteaptă să răspundem tastând „y” sau „Y”, sau „n” sau „N” și apăsând Enter.

Dacă apăsați Enter, acesta este tratat ca „n”. Comanda este executată numai dacă tastați „y” sau „Y”.

Am apăsat pe „y” și am apăsat pe Enter. Putem folosi ls pentru a verifica dacă fișierele au fost create.

ls one two three

Utilizarea xargs cu mai multe comenzi

Putem folosi mai multe comenzi cu xargs folosind opțiunea -I (argumente inițiale).

Această opțiune definește un „șir de înlocuire”. Oriunde apare simbolul pentru șirul de înlocuire în linia de comandă, sunt inserate valorile care au fost furnizate xargs.

Să folosim comanda tree pentru a ne uita la subdirectoarele din directorul curent. Opțiunea -d (director) face ca arborele să ignore fișierele și să raporteze numai despre directoare.

tree -d

Există un singur subdirector numit „imagini”.

Într-un fișier numit „directories.txt”, avem numele unor directoare pe care dorim să le creăm. Putem privi conținutul său folosind cat.

cat directories.txt

Vom folosi asta ca date de intrare pentru xargs. Comanda pe care o vom face este aceasta:

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

Aceasta se descompune astfel:

cat directories.txt |: Aceasta împinge conținutul fișierului directories.txt (toate noile nume de director) în xargs.
xargs -I %: Aceasta definește un „șir de înlocuire” cu simbolul „%”.
sh -c: Aceasta pornește un nou subshell. -c (comanda) îi spune shell-ului să citească comenzile din linia de comandă.
‘eco %; mkdir %’: fiecare dintre simbolurile „%” va fi înlocuit cu numele directorului transmis de xargs. Comanda echo va imprima numele directorului; comanda mkdir va crea directorul.

  De ce mai contează Desktop Linux

Directoarele sunt listate unul câte unul.

Putem folosi tree încă o dată pentru a verifica directoarele au fost create.

tree -d

Copierea fișierelor în mai multe locații

Putem folosi xargs pentru a ne permite să copiem fișiere în mai multe locații cu o singură comandă.

Vom introduce numele a două directoare în xargs ca parametri de intrare. Îi vom spune xargs să transmită doar unul dintre acești parametri odată la comanda cu care lucrează.

În acest caz, comanda este cp. Deci efectul este de a apela cp de două ori, de fiecare dată cu unul dintre cele două directoare ca parametru de linie de comandă. Parametrul xargs care permite acest lucru este opțiunea -n (număr maxim). Vom seta ca acesta să fie unul.

De asemenea, folosim opțiunea -v (verboză) cu cp, astfel încât să raporteze ce se întâmplă.

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

Fișierele sunt copiate în cele două directoare, câte un director. cp raportează fiecare acțiune de copiere a fișierului, astfel încât să putem vedea că au loc.

Ștergerea fișierelor din directoare imbricate

Dacă numele fișierelor conțin spații și caractere ciudate în ele – cum ar fi caracterele newline – xargs nu le va putea interpreta corect. Putem depăși această problemă folosind opțiunea -0 (terminator nul). Aceasta îi spune xargs să folosească caracterul nul ca delimitator final pentru numele fișierelor.

Vom folosi find în acest exemplu. find are propria sa opțiune pentru de-a face cu spațiile albe și caractere ciudate în numele fișierelor. Este opțiunea -print0 (nume complet, caracter nul).

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

Aceasta se descompune astfel:

găsi . -name „*.png”: find va căuta din directorul curent „.” pentru obiectele cu nume care se potrivesc cu „*.png” care sunt fișiere (tip -f).
-print0: numele vor fi terminate cu un caracter nul, iar spațiile și caracterele ciudate vor fi luate în considerare.
xargs -0: xargs va considera, de asemenea, că numele fișierelor sunt terminate în nul, iar spațiile și caracterele ciudate nu vor cauza probleme.
rm -v -rf „{}”: rm va fi detaliat și va raporta ce se întâmplă (-v). Va fi recursiv (-r) și va căuta prin subdirectoare imbricate și va elimina fișierele fără a cere (-f). „{}” este înlocuit cu fiecare nume de fișier.

  Cum să ascultați Pandora Radio pe Linux

găsi .  -Nume

Toate subdirectoarele sunt căutate, iar fișierele care se potrivesc cu modelul de căutare sunt șterse.

Eliminarea directoarelor imbricate

Să presupunem că vrem să eliminăm un set de subdirectoare imbricate. copacul ne va lăsa să le vedem.

tree -d

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

Această comandă va folosi find pentru a căuta recursiv în directorul curent. Ținta de căutare este un director numit „level_one”. Numele directoarelor sunt transmise prin xargs la rm.

găsi .  -Nume

Singurele modificări semnificative între această comandă și comanda anterioară sunt că termenul de căutare este numele directorului cel mai de sus și -type d îi spune să caute directoare, nu fișiere.

Numele fiecărui director este tipărit pe măsură ce este eliminat. Putem verifica cu arborele:

tree -d

Toate subdirectoarele imbricate sunt șterse.

Ștergerea tuturor fișierelor, cu excepția unui tip de fișier

Putem folosi find, xargs și rm pentru a șterge toate fișierele, cu excepția unui tip pe care vrem să-l păstrăm. Este ușor contraintuitiv, dar oferim numele tipului de fișier pe care dorim să-l păstrăm, nu numele celor pe care vrem să le ștergem.

Opțiunea -not îi spune find să returneze numele fișierelor care nu se potrivesc cu modelul de căutare. Folosim opțiunea -I (argumente inițiale) cu xargs încă o dată. De data aceasta, simbolul de înlocuire pe care îl definim este „{}”. Acesta se va comporta exact la fel ca simbolul de înlocuire șir pe care l-am generat anterior, care sa întâmplat să fie un „%”.

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

găsi .  -tip f -nu - nume

Putem verifica cu ls. Singurele fișiere rămase în director sunt cele care se potrivesc cu modelul de căutare „*.sh”.

ls -l

Crearea unui fișier arhivă cu Xargs

Putem folosi find pentru a căuta fișiere și a le trece prin xargs în tar, pentru a crea un fișier de arhivă.

Vom căuta în directorul curent. Modelul de căutare este „*.page”, așa că vom căuta fișiere „.page”.

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

găsi ./ - nume

Fișierele sunt listate conform așteptărilor, deoarece fișierul arhivă este creat.

Mediatorul de date

Uneori aveți nevoie de puțină schelă atunci când stivuiți lucrurile. xargs face o punte între comenzile care pot furniza informații și comenzile care nu sunt create pentru a le prelua.

Atât xargs, cât și find au un număr mare de opțiuni. Sunteți încurajat să consultați paginile lor de manual pentru a afla mai multe.