Puoi scrivere uno script che chiama file
e usare un'istruzione case per verificare i casi che ti interessano.
Per esempio
#!/bin/sh
case $(file "$1") in
(*script*|*\ text|*\ text\ *)
echo text
;;
(*)
echo binary
;;
esac
anche se ovviamente ci possono essere molti casi speciali che sono di interesse. Sto solo controllando strings
una copia di libmagic
, vedo circa 200 casi, ad es.
Konqueror cookie text
Korn shell script text executable
LaTeX 2e document text
LaTeX document text
Linux Software Map entry text
Linux Software Map entry text (new format)
Linux kernel symbol map text
Lisp/Scheme program text
Lua script text executable
LyX document text
M3U playlist text
M4 macro processor script text
Alcuni usano la stringa "testo" come parte di un tipo diverso, ad es.
SoftQuad troff Context intermediate
SoftQuad troff Context intermediate for AT&T 495 laser printer
SoftQuad troff Context intermediate for HP LaserJet
allo stesso modo script
potrebbe far parte di una parola, ma in questo caso non vedo problemi. Ma uno script dovrebbe cercare "text"
come parola , non come sottostringa .
Come promemoria, l' file
output non utilizza una descrizione precisa che avrebbe sempre "script" o "testo". Casi speciali sono qualcosa da considerare. Un follow-up ha commentato che --mime-type
funziona mentre questo approccio no, per i .svg
file. Tuttavia, in un test vedo questi risultati per i file svg:
$ ls -l *.svg
-r--r--r-- 1 tom users 6679 Jul 26 2012 pumpkin_48x48.svg
-r--r--r-- 1 tom users 17372 Jul 30 2012 sink_48x48.svg
-r--r--r-- 1 tom users 5929 Jul 25 2012 vile_48x48.svg
-r--r--r-- 1 tom users 3553 Jul 28 2012 vile-mini.svg
$ file *.svg
pumpkin_48x48.svg: SVG Scalable Vector Graphics image
sink_48x48.svg: SVG Scalable Vector Graphics image
vile-mini.svg: SVG Scalable Vector Graphics image
vile_48x48.svg: SVG Scalable Vector Graphics image
$ file --mime-type *.svg
pumpkin_48x48.svg: image/svg+xml
sink_48x48.svg: image/svg+xml
vile-mini.svg: image/svg+xml
vile_48x48.svg: image/svg+xml
che ho selezionato dopo aver visto un migliaio di file mostra solo 6 con "testo" nell'output di tipo mime. Probabilmente, abbinare "xml" alla fine dell'output di tipo mime potrebbe essere più utile, diciamo, che abbinare "SVG", ma usare uno script per farlo ti riporta al suggerimento fatto qui.
L'output di file
richiede un po 'di tuning in entrambi gli scenari, e non è affidabile al 100% (è confuso da molti dei miei script Perl, chiamandoli "dati").
Esiste più di una implementazione di file
. Quello più comunemente usato fa il suo lavoro libmagic
, che può essere utilizzato da diversi programmi (forse non direttamente da zsh
, anche se python
può).
Secondo la tabella di confronto dei test dei file per shell, Perl, Ruby e Python , Perl ha -T
un'opzione che può usare per fornire queste informazioni. Ma non elenca alcuna funzionalità comparabile per zsh
.
Ulteriori letture:
file
è un'utilità standard e può eseguire la magia dei file per determinare i tipi di file al meglio delle sue capacità. Può dire la maggior parte dei formati di testo e fa un lavoro abbastanza decente sui formati binari. Se tutto ciò che stai cercando di fare è scoprire se un file è di testo o meno, questo è il comando che ti interessa.