Ecco una versione semplificata con spiegazione estesa per principianti come me che stanno cercando di imparare a mettere più di un comando in una riga.
Se dovessi scrivere il problema in passaggi, sarebbe simile a questo:
// For every file in this directory
// Check the filetype
// If it's an ASCII file, then print out the filename
Per raggiungere questo obiettivo, possiamo utilizzare tre comandi UNIX: find
, file
, e grep
.
find
controllerà ogni file nella directory.
file
ci darà il tipo di file. Nel nostro caso, stiamo cercando un ritorno di "testo ASCII"
grep
cercherà la parola chiave "ASCII" nell'output di file
Quindi come possiamo metterli insieme in una singola riga? Ci sono molti modi per farlo, ma trovo che farlo nell'ordine del nostro pseudo-codice abbia più senso (specialmente per un principiante come me).
find ./ -exec file {} ";" | grep 'ASCII'
Sembra complicato, ma non male quando lo analizziamo:
find ./
= cerca in tutti i file in questa directory. Il find
comando stampa il nome del file di qualsiasi file che corrisponde all '"espressione", o qualsiasi cosa venga dopo il percorso, che nel nostro caso è la directory corrente o./
La cosa più importante da capire è che tutto ciò che segue quel primo bit verrà valutato come Vero o Falso. Se True, il nome del file verrà stampato. In caso contrario, il comando prosegue.
-exec
= questo flag è un'opzione all'interno del comando find che ci permette di usare il risultato di qualche altro comando come espressione di ricerca. È come chiamare una funzione all'interno di una funzione.
file {}
= il comando che viene chiamato all'interno di find
. Il file
comando restituisce una stringa che ti dice il tipo di file di un file. Regolarmente, sarebbe simile a questa: file mytextfile.txt
. Nel nostro caso, vogliamo che utilizzi qualsiasi file venga esaminato dal find
comando, quindi inseriamo le parentesi graffe {}
per agire come una variabile o un parametro vuoto. In altre parole, stiamo solo chiedendo al sistema di emettere una stringa per ogni file nella directory.
";"
= questo è richiesto da find
ed è il segno di punteggiatura alla fine del nostro -exec
comando. Vedere il manuale per 'trovare' maggiori spiegazioni se ne avete bisogno eseguendo man find
.
| grep 'ASCII'
= |
è una pipe. Pipe prende l'output di tutto ciò che è a sinistra e lo usa come input per ciò che è a destra. Prende l'output del find
comando (una stringa che è il tipo di file di un singolo file) e lo verifica per vedere se contiene la stringa 'ASCII'
. Se lo fa, restituisce vero.
ORA, l'espressione a destra di find ./
restituirà true quando il grep
comando restituirà true. Ecco.
find . -type f -exec grep -Il "" {} \;
.