Możesz napisać skrypt, który wywołuje file
, i użyć instrukcji case, aby sprawdzić przypadki, które Cię interesują.
Na przykład
#!/bin/sh
case $(file "$1") in
(*script*|*\ text|*\ text\ *)
echo text
;;
(*)
echo binary
;;
esac
choć oczywiście może być wiele specjalnych przypadków, które są interesujące. Po sprawdzeniu strings
kopii libmagic
widzę około 200 przypadków, np.
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
Niektórzy używają ciągu „tekst” jako części innego typu, np.
SoftQuad troff Context intermediate
SoftQuad troff Context intermediate for AT&T 495 laser printer
SoftQuad troff Context intermediate for HP LaserJet
podobnie script
może być częścią słowa, ale w tym przypadku nie widzę problemów. Ale skrypt powinien sprawdzać "text"
jako słowo , a nie podciąg .
Dla przypomnienia, file
wyjście nie używa dokładnego opisu, który zawsze zawierałby „skrypt” lub „tekst”. Szczególne przypadki są czymś do rozważenia. Kontynuacja skomentowała, że --mime-type
działa, podczas gdy to podejście nie, w przypadku .svg
plików. Jednak w teście widzę te wyniki dla plików 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
które wybrałem po zobaczeniu tysiąca plików, które pokazują tylko 6 z „tekstem” na wyjściu typu mime. Prawdopodobnie dopasowanie „xml” na końcu danych wyjściowych typu mime może być bardziej użyteczne, powiedzmy, niż dopasowanie „SVG”, ale użycie skryptu, aby to zrobić , spowoduje powrót do podanej tutaj sugestii.
Dane wyjściowe file
wymagają dostrajania w obu scenariuszach i nie są w 100% niezawodne (jest mylone przez kilka moich skryptów Perla, nazywając je „danymi”).
Istnieje więcej niż jedna implementacja file
. Ten najczęściej używany działa w libmagic
, który może być używany z różnych programów (być może nie bezpośrednio z zsh
, choć python
może).
Zgodnie z tabelą porównawczą testu plików dla powłok, Perla, Ruby i Pythona , Perl ma -T
opcję, za pomocą której może dostarczyć te informacje. Ale nie zawiera żadnej porównywalnej funkcji zsh
.
Dalsza lektura:
file
jest standardowym narzędziem i może uruchamiać magię plików w celu określania typów plików zgodnie z jego najlepszymi możliwościami. Potrafi rozpoznać większość formatów tekstowych i robi całkiem przyzwoitą robotę na formatach binarnych. Jeśli wszystko, co próbujesz zrobić, to dowiedzieć się, czy plik jest tekstowy, czy nie,