Come trovare i file per tipo di file?

So di poter trovare file utilizzando find: find . -type f -name "sunrise" . Risultato di esempio:

./sunrise ./events/sunrise ./astronomy/sunrise ./schedule/sunrise 

So anche che posso determinare il tipo di file di un file: file sunrise. Risultato di esempio:

sunrise: PEM RSA private key 

Ma come posso trovare file per tipo di file?

Ad esempio, my-find . -type f -name "sunrise" -filetype=bash-script:

./astronomy/sunrise ./schedule/sunrise 

Commenti

  • Non sono presenti --filetype opzione per il comando find o qualsiasi altra cosa che ti dirà il tipo di file. Lunica cosa che puoi fare è utilizzare --exec file {} \; e poi reindirizzarlo in grep Bourne se stavi cercando script bash o grep Perl se stavi cercando script Perl o qualcosa del genere.

Rispondi

“Tipi di file” su un sistema Unix sono cose come file normali, directory, pipe con nome, file speciali di caratteri, collegamenti simbolici ecc. Questi sono i tipi di file che find può filtrare con la sua -type opzione.

find non può da sola distinguere tra uno “script di shell”, un “file immagine JPEG” o qualsiasi altro tipo di file normale . Questi tipi di dati possono tuttavia essere distinti dallutilità file, che esamina particolari firme allinterno dei file stessi per determinarne il tipo.

Un modo comune di etichettare i diversi tipi di file di dati dipendono dal loro tipo MIME e file è in grado di determinare il tipo MIME di un file.


Utilizzando file con find per rilevare il tipo MIME di file regolari e utilizzarlo per trovare solo script di shell:

find . -type f -exec sh -c " case $( file -bi "$1" ) in */x-shellscript*) exit 0 esac exit 1" sh {} ";" -print 

oppure, utilizzando bash,

find . -type f \ -exec bash -c "[[ "$( file -bi "$1" )" == */x-shellscript* ]]" bash {} ";" \ -print 

Aggiungi -name sunrise prima di -exec se desideri rilevare solo gli script con quel nome.

Il comando find sopra troverà tutti i file regolari nella o sotto la directory corrente, e per ciascuno di questi file chiama un breve script di shell in linea. Questo script esegue file -bi sul file trovato ed esce con uno stato di uscita zero se loutput di quel comando contiene la stringa /x-shellscript. Se loutput non contiene quella stringa, esce con uno stato di uscita diverso da zero che fa sì che find continui immediatamente con il file successivo. Se il file è risultato essere uno script di shell, il comando find procederà con loutput del percorso del file “s (il -print al end, che potrebbe anche essere sostituito da qualche altra azione).

Il comando file -bi produrrà il tipo MIME del file. Per uno script di shell su Linux ( e la maggior parte degli altri sistemi), questo sarebbe qualcosa del tipo

text/x-shellscript; charset=us-ascii 

su sistemi con una variante leggermente più vecchia del file utility, potrebbe essere

application/x-shellscript 

Il bit comune è la /x-shellscript sottostringa.

Tieni presente che su macOS dovresti utilizzare file -bI invece di file -bi per motivi (il -i fa qualcosa di completamente diverso). Loutput su macOS è simile a quello di un sistema Linux.


Vorresti eseguire unazione personalizzata su ogni script di shell trovato, potresti fare th at con un altro -exec al posto di -print nei comandi find sopra, ma sarebbe anche possibile fare

find . -type f -exec sh -c " for pathname do case $( file -bi "$pathname" ) in */x-shellscript*) ;; *) continue esac # some code here that acts on "$pathname" done" sh {} + 

o, con bash,

find . -type f -exec bash -c " for pathname do [[ "$( file -bi "$pathname" )" != */x-shellscript* ]] && continue # some code here that acts on "$pathname" done" bash {} + 

Correlati:

Risposta

Puoi eseguire find su ogni file trovato e poi grep per il risultato che ti interessa.

# When looking for ASCII Text find . -type -exec file {} \; | grep "ASCII" # or for MS Word Documents find . -type f -exec file {} \; | grep "Microsoft Word" 

Suggerisco di rendere il modello di ricerca il più vicino possibile alle tue aspettative per mantenere il numero di il falso positivo corrisponde a basso.

Fai attenzione che i file con nuove righe nei nomi dei file potrebbero causare problemi con questo approccio.

Risposta

Utilizzo del perl” s File::LibMagic modulo:

perl -MFile::LibMagic=:easy -MFile::Find -le " find sub { print $File::Find::name if $_ eq "sunrise" and -f and MagicFile$_ eq "PEM RSA private key" }, @ARGV" -- . 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *