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 axargs
.xargs
passa i nomi dei file awc
.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
. ilecho
il comando stamperà il nome della directory; ilmkdir
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);