Come usare il comando xargs in Linux

Contenuti

Un prompt del terminale Linux su un laptop

Hai bisogno di concatenare alcuni comandi di Linux?, ma uno di loro non accetta input canalizzati? xargs puoi prendere l'output di un comando e inviarlo a un altro comando come parametri.

Tutte le utility Linux standard hanno tre flussi di dati associati a loro. Sono il flusso di input standard (standard), flusso di output standard (stdout) e il flusso di errore standard (stderr).

Questi flussi funzionano con il testo. Inviamo il biglietto (standard) a un comando usando il testo, e la soluzione (stdout) è scritto nella finestra del terminale come testo. Inoltre, i messaggi di errore vengono scritti nella finestra del terminale come testo (stderr).

Una delle grandi caratteristiche dei sistemi operativi simili a Linux e Unix è la capacità di reindirizzare l'output stdout di un comando all'input stdin di un secondo comando.. Al primo comando non interessa che il suo output non vada in una finestra di terminale, e al secondo comando non importa che il suo input non provenga da una tastiera.

Anche se tutti i comandi di Linux hanno i tre flussi standard, non tutti accettano lo standard output di un altro comando come input per il loro stdin. Ciò significa che non puoi incanalare l'input verso di loro.

xargs è un comando per creare pipeline di esecuzione utilizzando flussi di dati standard. Attraverso l'uso xargs possiamo fare comandi come echo, rm, e mkdir accetta l'input standard come argomenti.

Il comando xargs

xargs accetterà l'ingresso con filodiffusione. Può anche accettare input da un file. xargs usa quell'input come parametri per i comandi con cui ti abbiamo detto di lavorare. Se non contiamo xargs lavorare con un comando specifico, verrà utilizzato per impostazione predefinita echo.

Possiamo usarlo per dimostrare come xargs produrrà sempre una singola riga di output, anche da un ingresso multilinea.

Se usiamo il -1 (elenca un file per riga) con opzione ls, otteniamo un singola colonna di nomi di file.

ls -1 ./*.SH

Questo elenca i file di script della shell nella directory corrente.

Otteniamo una singola colonna come previsto. Se lo canalizziamo xargs cosa otteniamo?

ls -1 ./*.SH | xargs

L'output viene scritto nella finestra del terminale, come un lungo flusso di testo.

È questa capacità che xargs inserisci i parametri in altri comandi.

Utilizzo di xargs con WC

Possiamo usare xargs avere facilmente wc contare le parole, caratteri e linee in più file.

ls *.pagina | xargs wc

È questo che succede:

  • ls elenca i file * .pagina e passa la lista a xargs.
  • xargs passa i nomi dei file a wc.
  • wc tratta i nomi dei file come se li avessi ricevuti come parametri della riga di comando.

Le statistiche per ogni file vengono visualizzate insieme a un totale generale.

Usa xargs con conferma

Possiamo usare il -p opzione (interattivo) avere xargs Chiedici conferma che siamo felici di procedere.

Se passiamo una stringa di nomi di file a touch, attraverso xargs, touch Volere creare i file per noi.

eco 'uno due tre' | xargs -p touch

Viene visualizzato il comando da eseguire e xargs aspetta che rispondiamo scrivendo "y" o "y", o “n” o “N”, e premendo Invio.

Se premi semplicemente Invio, è trattato come “n”. Il comando viene eseguito solo se si digita "y" o "Y".

Premi "y" e premi Invio. Possiamo usare ls per verificare che i file siano stati creati.

è uno due tre

Usa xargs con alcuni comandi

Possiamo usare vari comandi con xargs usando il -I (argomenti iniziali) opzione.

Questa opzione imposta a “catena di sostituzione”. Ovunque nella riga di comando appaia il token per la stringa di sostituzione, i valori che sono stati forniti a xargs sono inseriti.

Usiamo il tree comando per visualizzare le sottodirectory della directory corrente. il -d (directory) cause di opzione tree ignorare i file e segnalare solo le directory.

albero -d

C'è un'unica sottodirectory chiamata “immagini”.

In un file chiamato "directory.txt", abbiamo i nomi di alcune directory che sosteniamo di aver creato. Possiamo guardare i tuoi contenuti usando cat.

cat directory.txt

Lo useremo come dati di input per xargs. Il comando a cui stiamo andando è questo:

cat directory.txt | xargs -I % sh -c 'eco %; mkdir %'

Questo si rompe così:

  • cat directory.txt |: Questo inserisce il contenuto del file directory.txt (tutti i nuovi nomi di directory) Su xargs.
  • xargs -I%: Questo stabilisce a “catena di sostituzione” con gettone “%”.
  • sh-c: Questo inizia un nuovo sottolivello. il -c (comando) dice alla shell di leggere i comandi dalla riga di comando.
  • 'eco' %; mkdir% ‘: ciascuno dei gettoni “%” sarà sostituito dai nomi delle directory che sono passati xargs. il echo il comando stamperà il nome della directory; il mkdir il comando creerà la directory.

Le directory sono elencate una per una.

Possiamo usare tree ancora una volta per verificare che le directory siano state create.

albero -d

Copia i file in più posizioni

Possiamo usare xargs per consentirci di copiare file in più posizioni con un singolo comando.

Invieremo i nomi di due directory a xargs come parametri di input. Ben detto xargs per passare solo uno di questi parametri alla volta al comando con cui stai lavorando.

In questa circostanza, il comando è cp. Quindi l'effetto è chiamare cp due volte, ogni volta con una delle due directory come parametro della riga di comando. il xargs parametro che permette che ciò accada è il -n (numero massimo) opzione. Impostiamo questo per essere uno.

Utilizziamo anche il -v (dettagliato) opzione con cp per segnalare cosa sta succedendo.

echo ~/Backup/ ~/Documenti/file-di-pagina/ | xargs -n 1 cp -v ./*.page

I file vengono copiati nelle due directory, una directory allo stesso tempo. cp segnala ogni azione di copia del file in modo da poter vedere come vengono eseguite.

Rimuovi i file nelle directory nidificate

Se i nomi dei file hanno spazi e caratteri strani, come caratteri di nuova riga, xargs non sarai in grado di interpretarli correttamente. Possiamo superare questo problema usando l'opzione -0 (terminatore nullo). Questo dice xargs usare il carattere null come delimitatore finale per i nomi dei file.

Utilizzeremo find in questo esempio. find ha la sua opzione per occuparsi degli spazi bianchi e strani caratteri nei nomi dei file. È lui -print0 (nome e cognome, carattere nullo).

trova . -nome "*.png" -digita f -print0 | xargs -0 rm -v -rf "{}"

Questo si rompe così:

  • circostanze . -Nome “* .png”: find cercherà nella directory corrente “.” per oggetti con nomi corrispondenti “* .png” cosa sono i file (type -f).
  • -print0: i nomi finiranno con un carattere nullo e gli spazi e i caratteri estranei saranno soddisfatti.
  • xargs -0: xargs inoltre considererà che i nomi dei file terminino con null, e spazi e caratteri strani non causeranno problemi.
  • rm -v -rf “{}”: rm sarà prolisso e riferirà cosa sta succedendo (-v). Sarà ricorsivo (-R) e cercherà nelle sottodirectory annidate, e cancellerà i file senza chiedere (-f). Il “{}” viene sostituito per ogni nome di file.

Vengono cercate tutte le sottodirectory e i file che corrispondono al modello di ricerca vengono rimossi.

Rimuovi le directory nidificate

Supponiamo di voler eliminare un insieme di sottodirectory nidificate. tree li facciamo vedere.

albero -d

trova . -nome "livello uno" -tipo d printo | xargs -o rm -v -rf "{}"

Questo comando utilizzerà find per cercare in modo ricorsivo all'interno della directory corrente. La destinazione della ricerca è una directory chiamata “livello uno”. I nomi delle directory vengono passati xargs per rm.

Gli unici cambiamenti significativi tra questo comando e il comando precedente sono, il termine di ricerca è il nome della directory superiore e -type d dado find per cercare nelle directory, nessun documento.

Il nome di ogni directory viene stampato man mano che viene cancellato. Possiamo consultarci con tree :

albero -d

Tutte le sottodirectory annidate vengono rimosse.

Elimina tutti i file, tranne un tipo di file

Possiamo usare find, xargs e rm per eliminare tutti i file tranne un tipo che vogliamo mantenere. È un po' contraddittorio, ma forniamo il nome del tipo di file che intendiamo Salva, non il nome di quelli che vogliamo eliminare.

il -not opzione dice find per restituire i nomi dei file che no corrisponde al modello di ricerca. Stiamo usando il -I (argomenti iniziali) opzione con xargs un'altra volta. Questa volta, il token di stringa sostitutivo che stiamo definendo è “{}”. Questo si comporterà esattamente come il token di stringa di sostituzione che abbiamo generato in precedenza, che si è rivelato essere un “%”.

trova . -digitare f -not - nome "*.SH" -print0 | xargs -0 -io {} rm -v {}

Possiamo consultarci con ls. Gli unici file rimasti nella directory sono quelli che corrispondono al modello di ricerca “* .SH”.

ls -l

Crea un archivio con Xargs

Possiamo usare find per cercare file e passarli xargs per tar, per creare un file di archivio.

Cerchiamo nella directory corrente. Il modello di ricerca è “* .pagina”, quindi cercheremo i file “.pagina”.

trova ./ - nome "*.pagina" -digita f -print0 | xargs -0 -tar -cvzf page_files.tar.gz

I file sono elencati come previsto, come viene creato l'archivio.

Il mediatore dei dati

A volte hai bisogno di una piccola impalcatura quando metti insieme le cose. xargs colma il divario tra i comandi che possono inviare informazioni e i comandi che non sono progettati per riceverle.

Entrambi xargs e find ha un gran numero di alternative. Ti suggeriamo di consultare le loro pagine man per maggiori informazioni..

impostaTimeout(funzione(){
!funzione(F,B,e,v,n,T,S)
{Se(f.fbq)Restituzione;n=f.fbq=funzione(){n.callMethod?
n.callMethod.apply(n,argomenti):n.queue.push(argomenti)};
Se(!f._fbq)f._fbq = n;n.push=n;n.loaded=!0;n.version='2.0′;
n.coda=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(T,S) } (window, documento,'copione',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('dentro', '335401813750447');
fbq('traccia', 'Visualizzazione della pagina');
},3000);

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.