I "tipi di file" su un sistema Unix sono cose come file regolari, directory, pipe nominate, file speciali di caratteri, collegamenti simbolici ecc. Questi sono i tipi di file che find
possono filtrare con la sua -type
opzione.
L' find
utilità non può di per sé distinguere tra "script di shell", "file di immagine JPEG" o qualsiasi altro tipo di file normale . Questi tipi di dati possono tuttavia essere distinti file
dall'utilità, che esamina determinate firme all'interno dei file stessi per determinarne il tipo.
Un modo comune per etichettare i diversi tipi di file di dati è in base al loro tipo MIME ed file
è in grado di determinare il tipo MIME di un file.
Utilizzare 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
o, usando bash
,
find . -type f \
-exec bash -c '[[ "$( file -bi "$1" )" == */x-shellscript* ]]' bash {} ';' \
-print
Aggiungi -name sunrise
prima del -exec
se desideri rilevare solo script con quel nome.
Il find
comando sopra troverà tutti i file regolari dentro o sotto la directory corrente e per ciascuno di questi file chiama uno script shell in linea breve. Questo script viene eseguito file -bi
sul file trovato ed esce con uno stato di uscita pari a zero se l'output di quel comando contiene la stringa /x-shellscript
. Se l'output non contiene quella stringa, esce con uno stato di uscita diverso da zero che fa sì find
che continui immediatamente con il file successivo. Se il file risulta essere uno script di shell, il find
comando procederà all'output del percorso del file ( -print
alla fine, che potrebbe anche essere sostituito da qualche altra azione).
Il file -bi
comando genererà il tipo MIME del file. Per uno script di shell su Linux (e la maggior parte degli altri sistemi), questo sarebbe qualcosa di simile
text/x-shellscript; charset=us-ascii
mentre su sistemi con una variante leggermente più vecchia file
dell'utilità, potrebbe essere
application/x-shellscript
Il bit comune è la /x-shellscript
sottostringa.
Nota che su macOS, dovresti utilizzare file -bI
invece file -bi
per motivi (l' -i
opzione fa qualcosa di molto diverso). L'output su macOS è simile a quello di un sistema Linux.
Vorresti eseguire qualche azione personalizzata su ogni script di shell trovato, potresti farlo con un altro -exec
al posto di -print
nei find
comandi sopra, ma sarebbe anche possibile farlo
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 {} +
Relazionato:
--filetype
opzione per il comando find o qualsiasi altra cosa che ti dirà il tipo di file. L'unica cosa che puoi fare è usare--exec file {} \;
e poi reindirizzarlogrep Bourne
se stavi cercando script bash ogrep Perl
se stavi cercando script Perl o qualcosa del genere.