Ricerca nel sito web

Come usare il comando xargs in Linux


Ti sei mai trovato nella situazione in cui esegui lo stesso comando più e più volte per più file? Se è così, sai quanto può sembrare noioso e inefficiente. La buona notizia è che esiste un modo più semplice, reso possibile tramite il comando xargs nei sistemi operativi basati su Unix. Con questo comando puoi elaborare più file in modo efficiente, risparmiando tempo ed energia. In questo tutorial imparerai come eseguire un comando o uno script per più file contemporaneamente, evitando l'arduo compito di elaborare singolarmente numerosi file di registro o file di dati.

Ci sono due ingredienti per il comando xargs. Innanzitutto, è necessario specificare i file di interesse. In secondo luogo, è necessario indicare quale comando o script verrà eseguito per ciascuno dei file specificati.

Questo tutorial coprirà tre scenari in cui il comando xargs può essere utilizzato per elaborare file che si trovano all'interno di diverse directory:

  1. Contare il numero di righe in tutti i file

  2. Stampa la prima riga di file specifici

  3. Elabora ogni file utilizzando uno script personalizzato

Considera la seguente directory denominata xargstest (l'albero delle directory può essere visualizzato usando il comando tree con le opzioni combinate -i e -f, che stampano i risultati senza indentazione e con il prefisso del percorso completo per ogni file):


$ tree -if xargstest/

Il contenuto di ciascuno dei sei file è il seguente:

La directory xargstest, le sue sottodirectory ei file verranno utilizzati negli esempi seguenti.

Scenario 1: contare il numero di righe in tutti i file

Come accennato in precedenza, il primo ingrediente per il comando xargs è un elenco di file per i quali verrà eseguito il comando o lo script. Possiamo usare il comando find per identificare ed elencare i file che ci interessano. L'opzione -name 'file??' specifica che solo i file con nomi che iniziano con file seguito da due caratteri qualsiasi verranno confrontati all'interno della directory xargstest. Questa ricerca è ricorsiva per impostazione predefinita, il che significa che il comando find cercherà i file corrispondenti all'interno di xargstest e in tutte le sue sottodirectory.


$ find xargstest/ -name 'file??'

xargstest/dir3/file3B
xargstest/dir3/file3A
xargstest/dir1/file1A
xargstest/dir1/file1B
xargstest/dir2/file2B
xargstest/dir2/file2A

Possiamo reindirizzare i risultati al comando sort per ordinare i nomi dei file in sequenza:


$ find xargstest/ -name 'file??' | sort

xargstest/dir1/file1A
xargstest/dir1/file1B
xargstest/dir2/file2A
xargstest/dir2/file2B
xargstest/dir3/file3A
xargstest/dir3/file3B

Ora abbiamo bisogno del secondo ingrediente, che è il comando da eseguire. Usiamo il comando wc con l'opzione -l per contare il numero di nuove righe in ogni file (stampato all'inizio di ogni riga di output):


$ find xargstest/ -name 'file??' | sort | xargs wc -l

 1 xargstest/dir1/file1A
 2 xargstest/dir1/file1B
 3 xargstest/dir2/file2A
 4 xargstest/dir2/file2B
 5 xargstest/dir3/file3A
 6 xargstest/dir3/file3B
21 total

Vedrai che invece di eseguire manualmente il comando wc -l per ciascuno di questi file, il comando xargs ti consente di completare questa operazione in un unico passaggio. Attività che in precedenza potevano sembrare ingestibili, come l'elaborazione di centinaia di file individualmente, ora possono essere eseguite abbastanza facilmente.

Scenario 2: stampa la prima riga di file specifici

Ora che conosci le basi di come usare il comando xargs, hai la libertà di scegliere quale comando vuoi eseguire. A volte, potresti voler eseguire comandi solo per un sottoinsieme di file e ignorarne altri. In questo caso, puoi utilizzare il comando find con l'opzione -name e il carattere glob ? (corrisponde a qualsiasi singolo carattere) per selezionare file specifici da inserire nel comando xargs. Ad esempio, se desideri stampare la prima riga di tutti i file che terminano con un carattere B e ignorare i file che terminano con un carattere A, utilizza la seguente combinazione dei comandi find, xargs e head (head -n1 stamperà la prima riga in un file):


$ find xargstest/ -name 'file?B' | sort | xargs head -n1

==> xargstest/dir1/file1B <==
one

==> xargstest/dir2/file2B <==
one

==> xargstest/dir3/file3B <==
one

Vedrai che sono stati elaborati solo i file con nomi che terminano con un carattere B e tutti i file che terminano con un carattere A sono stati ignorati.

Scenario 3: elaborare ogni file utilizzando uno script personalizzato

Infine, potresti voler eseguire uno script personalizzato (in Bash, Python o Perl per esempio) per i file. Per fare ciò, sostituisci semplicemente il nome del tuo script personalizzato al posto dei comandi wc e head mostrati in precedenza:


$ find xargstest/ -name 'file??' | xargs myscript.sh

Lo script personalizzato myscript.sh deve essere scritto per prendere un nome di file come argomento ed elaborare il file. Il comando precedente richiamerà quindi lo script per ogni file trovato dal comando find.

Si noti che gli esempi precedenti includono nomi di file che non contengono spazi. In generale, la vita in un ambiente Linux è molto più piacevole quando si utilizzano nomi di file senza spazi. Se hai bisogno di gestire i nomi dei file con spazi, i comandi precedenti non funzioneranno e dovrebbero essere modificati per adattarli. Ciò si ottiene con l'opzione -print0 per il comando find (che stampa il nome completo del file su stdout, seguito da un carattere nullo) e l'opzione -0 per il comando xargs (che interpreta un carattere nullo come la fine di una stringa), come mostrato di seguito:


$ find xargstest/ -name 'file*' -print0 | xargs -0 myscript.sh

Si noti che l'argomento per l'opzione -name è stato cambiato in 'file*', il che significa che tutti i file con nomi che iniziano con file e seguiti da un numero qualsiasi di caratteri saranno abbinati.

Riepilogo

Articoli correlati: