GNU/Linux >> Linux Esercitazione >  >> Linux

8 esempi pratici del comando Xargs di Linux per principianti

Gli xargs di Linux command potrebbe non essere uno strumento da riga di comando molto popolare, ma questo non toglie il fatto che sia estremamente utile, specialmente se combinato con altri comandi come trova e grep . Se non conosci xargs e vuoi capirne l'utilizzo, sarai felice di sapere che è esattamente ciò che faremo qui.

Before we proceed, please keep in mind that all the examples presented in this tutorial have been tested on Ubuntu 18.04 LTS (Bionic Beaver). Shell used is Bash, and version is 4.4.19.

1. Come funziona il comando Xargs?

Bene, prima di saltare al suo utilizzo, è importante capire cosa fa esattamente Xargs. In parole povere, lo strumento - nella sua forma più elementare - legge i dati dallo standard input (stdin) ed esegue il comando (fornito come argomento) una o più volte in base all'input letto. Eventuali spazi e spazi vuoti nell'input vengono trattati come delimitatori, mentre le righe vuote vengono ignorate.

Se nessun comando viene fornito come argomento a xargs, il comando predefinito eseguito dallo strumento è echo . Ad esempio, nell'esempio seguente, ho appena eseguito 'xargs' e inserito 'Hello World' su stdin. Quando ho premuto Ctrl+D (per dire a xargs che abbiamo finito con l'input), l'eco il comando è stato eseguito automaticamente e 'Hello World' è stato stampato di nuovo.

2. Come usare xargs con un altro comando?

Mentre eco è il comando predefinito eseguito da xargs, puoi specificare esplicitamente qualsiasi altro comando. Ad esempio, puoi passare il comando find insieme alla sua opzione '-name' come argomento a xargs, quindi passare il nome del file (o tipo di file) che desideri trovare per cercare come input tramite stdin.

Ecco il comando completo in questione:

xargs find -name

Ad esempio, abbiamo fornito "*.txt" in input tramite stdin, il che significa che vogliamo il find comando per cercare tutti i file .txt nella directory corrente (così come nelle sue sottodirectory).

Ecco il comando in azione:

3. Come fare in modo che xargs esegua il comando più volte (una per ogni riga/argomento di input)

Nell'esempio discusso nella sezione precedente, volevamo cercare file .txt, quindi abbiamo fornito "*.txt" nell'input. Ma cosa succede se il requisito è cercare anche altri tipi di file, come .log e .tmp?

Prova a darli come input a xargs dopo "*.txt" e guarda cosa succede. Bene, dovresti ricevere un errore simile al seguente:

Questo perché xargs passa "*.txt" e "*.log" come input del nome del file a find comando e quindi trova fallisce poiché viene eseguito con due nomi di file in input. Puoi pensare al comando find in esecuzione nel modo seguente:

find -name "*.txt" "*.log"

E non è il modo corretto.

Quello che vogliamo è che il comando xargs debba prima passare "*.txt" a find comando, in modo che trova ci fornisce risultati relativi ai file .txt, quindi viene passato "*.log". Questo può essere fatto usando il -L opzione della riga di comando fornita da xargs.

Il -L l'opzione della riga di comando richiede un numero che considera come il numero massimo di righe non vuote che devono essere passate come input al comando in una volta. Quindi, nel nostro caso, quel valore sarà 1, poiché vogliamo che una riga di input venga passata come input per trovare contemporaneamente.

Quindi, ecco il comando che dovremmo eseguire:

xargs -L 1 find -name

Lo screenshot seguente mostra il comando di cui sopra in azione:

Fin qui tutto bene. Ma cosa succede se si passa l'input nel modo seguente:

"*.txt" "*.log"

Bene, il comando fallirà perché '-L 1' assicurerà che la riga completa venga passata a find comando.

In situazioni come queste, puoi usare l'opzione della riga di comando '-n'.

L'opzione della riga di comando '-n', come '-L', richiede un numero che rappresenti il ​​numero di argomenti che vuoi che xargs passi per riga di comando. Nel caso, abbiamo appena discusso, "*.txt" e "*.log" dovrebbero essere argomenti diversi e, poiché vogliamo che vengano passati individualmente, dovremo fornire "1" come valore per "-n" .

xargs -n 1 trova -nome

Quindi questi sono i modi in cui possiamo fare in modo che xargs esegua un comando più volte.

4. Come fare in modo che xargs gestisca i nomi dei file con spazi

Se ricordi, all'inizio abbiamo menzionato che xargs tratta gli spazi vuoti (così come i caratteri di nuova riga) come delimitatori. Ciò può causare problemi nei casi in cui i nomi di file passati come input a xargs contengono spazi.

Ad esempio, supponiamo che la directory corrente contenga un file denominato "new music.mp3" e desideri che xargs trasmetta questo nome a mplayer in modo che quest'ultimo possa riprodurre il file. Se segui il metodo convenzionale, riceverai un errore:

Questo perché a causa dello spazio tra 'new' e 'music.mp3', questi vengono trattati come due file diversi da mplayer. Un modo per risolvere questo problema è utilizzare la barra rovesciata fornendo l'input:

new\ music.mp3

L'altro modo è cambiare il delimitatore, cosa che puoi fare usando -d opzione. Ad esempio, puoi chiedere a xargs di considerare solo newline come delimitatore, cosa che può essere fatta nel modo seguente:

xargs -d '\n' mplayer

5. Come fare in modo che xargs gestisca nomi di file con caratteri di nuova riga

Quindi, ora sappiamo come possiamo fare in modo che xargs gestisca nomi di file che contengono spazi bianchi. Ma per quanto riguarda le nuove righe? Sì, anche i nomi dei file possono avere caratteri di nuova riga. Ad esempio, c'è un file chiamato 'foo'[newline]'file.txt'. Sul terminale, il nome viene visualizzato come 'foo?file.txt'.

Supponiamo ora che io voglia il trovare comando per trovare tutti i file con nomi che iniziano con il testo "foo", quindi usa xargs per aprire questi file in gedit . Ecco il comando:

find . -name "foo*" | xargs gedit

Purtroppo, il comando non riesce a raggiungere il suo scopo poiché un nuovo file con il nome "foo" si apre in Gedit. Ciò è probabile perché il carattere di nuova riga viene trattato come un delimitatore da xargs.

Per risolvere questo problema, usa -print0 opzione che trova le offerte e la accoppia con -0 di xarg opzione. Ecco come la pagina man di find spiega questa opzione:

 -print0
True; print the full file name on the standard output, followed by a null character (instead of thenewline character that -print uses). This allows file names that contain newlines or other types ofwhite space to be correctly interpreted by programs that process the find output. This option corresponds to the -0 option of xargs.

Quindi, ecco il comando che dovremmo usare:

find . -name "foo*" -print0 | xargs -0 gedit

6. Come trovare file contenenti un testo specifico

Il comando xargs è davvero utile se vuoi cercare file contenenti un testo/stringa specifico. Ad esempio, se desideri trovare file .txt contenenti il ​​testo 'abc', puoi farlo nel modo seguente:

find -name "*.txt" | xargs grep "abc"

Ecco il comando in azione:

Come è abbastanza ovvio, in questo caso, il comando xargs ottiene il suo input da find comando.

7. Come fare in modo che xargs accetti l'input da un file 

Finora, abbiamo visto xargs accettare input da stdin (che è il comportamento predefinito) così come da un altro comando (discusso nell'ultima sezione). Tuttavia, se vuoi, puoi anche fare in modo che xargs accetti l'input da un file.

Il comando è -a l'opzione ti consente di farlo. Questa opzione prevede un nome file:questo sarebbe il file da cui xargs leggerà l'input.

Ad esempio, supponiamo che ci sia un file con il nome 'input.txt'. Contiene l'input per xargs (fondamentalmente, i contenuti sono due nomi di file:testfile1.txt e testfile2.txt). Ecco come xargs può essere utilizzato per leggere l'input da questo file e passarlo a un altro comando, ad esempio ls .

xargs -a input.txt ls -lart

Ecco il comando in azione:

8. Come fare in modo che xargs cerchi l'autorizzazione dell'utente prima di eseguire un comando

Abbiamo già discusso di come fare in modo che xargs esegua un comando più volte (vedi punto 3 sopra). Ma cosa succede se vuoi che xargs chieda il tuo permesso ogni volta che esegue il comando? È possibile? Sì, lo è:il -p l'opzione della riga di comando lo rende possibile.

Ecco un esempio di come eseguire xargs in modalità interattiva:

Abbiamo appena scalfito la superficie qui poiché ci sono molte altre funzionalità fornite dal comando xargs sotto forma di opzioni della riga di comando. Prova i concetti/le funzionalità di xargs che abbiamo spiegato in questo tutorial e, in caso di dubbi o domande, consulta la sua pagina man.


Linux
  1. 10 Esempi di comandi "rm" per principianti Linux

  2. 10 esempi di comandi Linux Cat per principianti

  3. Tutorial sul comando cd di Linux per principianti (8 esempi)

  4. Comando killall Linux per principianti (8 esempi)

  5. Esempi di comandi xargs in Linux

Tutorial sui comandi Linux ss per principianti (8 esempi)

Comando di localizzazione Linux per principianti (8 esempi)

16 Esempi pratici di comando Linux LS per principianti

Spiegazione del comando Linux mv per principianti (8 esempi)

12 Esempi pratici di In Command in Linux

Esempi di comandi xargs di Linux