GNU/Linux >> Linux Esercitazione >  >> Linux

Come utilizzare il potente comando Xargs in Linux [spiegato con esempi]

xargs è uno dei comandi più potenti in Linux. In questo tutorial, ti mostrerò come puoi xargs convertire l'input standard in comandi.

Cos'è il comando xargs?

Il comando xargs legge le righe di testo dall'input standard o dall'output di un altro comando, le trasforma in comandi e le esegue.

Troverai spesso il comando xargs utilizzato con il comando trova. Il comando trova fornisce un elenco di nomi di file e il comando xargs ti consente di utilizzare quei nomi di file, uno per uno, come se fossero stati inseriti nell'altro comando.

Poiché xargs funziona sul reindirizzamento, consiglio vivamente di rispolverare le tue conoscenze su stdin, stdout e reindirizzamento pipe in Linux.

Come usare il comando xargs?

Il comando xargs ha la seguente sintassi:

xargs [options] [command [initial-arguments]]

Ma probabilmente non lo userai in quel modo. Il suo potere sta nel combinare l'output di un comando con un altro. Vediamolo con un semplice esempio.

Nella mia directory attuale, ho alcuni file di testo e flowers.txt ha il nome di tutti questi file:

[email protected]:~/tutorial$ ls
flowers.txt  lily.txt  one_lotus.txt  rose.txt  three_lotus.txt  two_lotus.txt
[email protected]:~/tutorial$ cat flowers.txt 
lily.txt
one_lotus.txt
rose.txt
three_lotus.txt
two_lotus.txt

Ora il mio obiettivo è che voglio vedere la dimensione del file di tutti i file menzionati nel flowers.txt. Il buon senso dice che potrei combinare il comando cat per visualizzare tutti i nomi di file e quindi reindirizzarlo al comando du per verificare la dimensione del file.

Ma se lo eseguo direttamente, non darà la dimensione di ciascuno dei file menzionati nel file flowers.txt.

[email protected]:~/tutorial$ du -h
52K	.
[email protected]:~/tutorial$ cat flowers.txt | du -h
52K	.

Come mai? Innanzitutto, il comando du non accetta l'input standard. In secondo luogo, l'output del comando cat non sono i singoli nomi di file. È come una parola separata da un carattere di nuova riga.

La magia del comando xargs è che prenderà questo e il testo separati da spazi vuoti o nuove righe e li convertirà in input individuali per il comando successivo.

[email protected]:~/tutorial$ cat flowers.txt | xargs du -h
4.0K	lily.txt
4.0K	one_lotus.txt
16K	rose.txt
4.0K	three_lotus.txt
16K	two_lotus.txt

Pensalo come equivalente a inserire quei nomi di file nel comando du:

[email protected]:~/tutorial$ du -h lily.txt one_lotus.txt rose.txt three_lotus.txt two_lotus.txt 
4.0K	lily.txt
4.0K	one_lotus.txt
16K	rose.txt
4.0K	three_lotus.txt
16K	two_lotus.txt

Adesso ti rendi conto della potenza del comando xargs, vero?

xargs e trova:fatti l'uno per l'altro

Lo troverai spesso utilizzato in combinazione con il "comando trova". Il comando trova cerca file e directory e ne restituisce i nomi. Grazie a xargs, puoi utilizzare il risultato del comando find per scopi specifici come rinominarli, spostarli, eliminarli e altro.

Diciamo che vuoi ottenere tutti i file che terminano con .txt e contengono la parola red. Puoi combinare i comandi find e grep con l'aiuto di xargs:

[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs grep -l red
./three_lotus.txt
./two_lotus.txt
./rose.txt

Gestire i nomi dei file con gli spazi

Se hai un file con spazio nel suo nome, causerà problemi. Diciamo che ho rinominato three_lotus.txt in "three lotus.txt". Ora, quando viene elaborato tramite xargs, viene visto come due file separati come tre e lotus.txt.

[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs grep -l red
./two_lotus.txt
grep: ./three: No such file or directory
grep: lotus.txt: No such file or directory
./rose.txt

In questi casi, dovresti usare l'opzione -print0 del comando trova. Separa le righe con caratteri nulli ASCII invece di caratteri di nuova riga. Allo stesso modo, dovresti anche usare xargs con -0 per accettare i null ASCII.

[email protected]:~/tutorial$ find . -type f -print0 -name "*.txt" | xargs -0 grep -l red
./two_lotus.txt
./three lotus.txt
./rose.txt

Guarda quale comando viene eseguito

Se vuoi vedere quale comando viene eseguito con l'aiuto di xargs, puoi usare l'opzione -t. Stamperà il comando effettivo in esecuzione.

[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs -t touch
touch ./three_lotus.txt ./two_lotus.txt ./lily.txt ./rose.txt

Forza xargs a richiedere conferma prima di eseguire il comando

Alcune situazioni richiedono una maggiore attenzione come l'eliminazione dei file. Sarà una buona idea vedere quale comando verrà eseguito e avere la possibilità di negare l'esecuzione.

Puoi usare l'opzione -p di xargs per ottenere il prompt.

[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs -p rm
rm ./three_lotus.txt ./two_lotus.txt ./lily.txt ./rose.txt ?...n

Utilizzo del segnaposto con xargs per avere un maggiore controllo su di esso

Per impostazione predefinita, il comando xargs aggiunge lo standard input come argomento alla fine del comando. Questo crea un problema quando devi usarlo prima dell'ultimo argomento.

Ad esempio, se si utilizza il comando di spostamento, è necessaria prima l'origine e poi la destinazione. Se vuoi spostare i file trovati in una directory di destinazione, questo comando non funzionerà:

[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs -p mv new_dir
mv new_dir ./three_lotus.txt ./two_lotus.txt ./lily.txt ./rose.txt ?...y
mv: target './rose.txt' is not a directory

Qui è dove puoi usare i segnaposto in xargs con l'opzione -Mi piace questo:

[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs -p -I {} mv {} new_dir
mv ./three_lotus.txt new_dir ?...n
mv ./two_lotus.txt new_dir ?...n
mv ./lily.txt new_dir ?...n
mv ./rose.txt new_dir ?...n

Pensalo come se xargs ottenga tutti i nomi di file dal comando trova e lo tenga in {}. Quindi va al comando mv e fornisce il contenuto di {}.

La differenza principale qui è che invece di inserire tutti i nomi di file nello stesso comando, li aggiunge uno per uno. Questo è il motivo per cui il comando mv è stato chiamato per ogni argomento (come puoi vedere nell'esempio sopra).

Nota:ho usato {} come segnaposto. Puoi usare la maggior parte delle altre lettere o caratteri come segnaposto. {} è una scommessa sicura e facile da capire e distinguere.

Esecuzione di più comandi con xargs

Puoi usare i segnaposto per eseguire più comandi con xargs.

[email protected]:~/tutorial$ find . -type f -name "*.txt" | xargs -I {} sh -c 'ls -l {}; du -h {}' 
-rw-rw-r-- 1 abhishek abhishek 0 May 28 17:02 ./three_lotus.txt
0	./three_lotus.txt
-rw-rw-r-- 1 abhishek abhishek 0 May 28 17:02 ./two_lotus.txt
0	./two_lotus.txt
-rw-rw-r-- 1 abhishek abhishek 0 May 28 17:02 ./lily.txt
0	./lily.txt
-rw-rw-r-- 1 abhishek abhishek 0 May 28 17:02 ./rose.txt
0	./rose.txt

Tieni presente che il segnaposto non si estenderà al reindirizzamento della pipe successiva o ad altri comandi. Questo è il motivo per cui ho usato il comando sh qui.

C'è sempre di più...

Ho usato principalmente il comando find con xargs negli esempi qui perché è quello che vedrai di più. Ma ciò non significa che xargs sia limitato all'uso solo con il comando trova. Uno di questi esempi pratici del comando xargs è quando si desidera interrompere tutti i contenitori docker in esecuzione:

docker ps -q | xargs docker stop

Come la maggior parte degli altri comandi Linux, ci sono molte più opzioni anche con xargs. Puoi sempre fare riferimento alla pagina man del comando xargs per maggiori informazioni.

Penso che gli esempi di comandi xargs elencati qui siano sufficienti per darti una buona comprensione di questo fantastico comando.

Se hai domande o suggerimenti, faccelo sapere nella sezione commenti.


Linux
  1. Come usare il comando Linux grep

  2. Come usare il comando cronologia in Linux

  3. Quale comando in Linux [spiegato con esempi]

  4. Come utilizzare il comando id in Linux

  5. Come utilizzare il comando "schermo" in Linux

Come utilizzare il comando superiore in Linux

Come utilizzare il comando Ping di Linux

Come utilizzare il comando fd sul sistema Linux

Come utilizzare il comando wget in Linux?

Come usare il comando xargs in Linux?

Come utilizzare il comando RPM in Linux