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
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" -- .
--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 ingrep Bourne
se stavi cercando script bash ogrep Perl
se stavi cercando script Perl o qualcosa del genere.