Учитывая этот каталог файлов:
$ file *
1.txt: UTF-8 Unicode (with BOM) text, with CRLF line terminators
2.pdf: PDF document, version 1.5
3.pdf: PDF document, version 1.5
4.dat: data
5.txt: ASCII text
6.jpg: JPEG image data, JFIF standard 1.02, aspect ratio, density 100x100, segment length 16, baseline, precision 8, 2833x972, frames 3
7.html: HTML document text, UTF-8 Unicode text, with very long lines, with no line terminators
8.js: UTF-8 Unicode text
9.xml: XML 1.0 document text
A.pl: a /opt/local/bin/perl script text executable, ASCII text
B.Makefile: makefile script text, ASCII text
C.c: c program text, ASCII text
D.docx: Microsoft Word 2007+
Вы можете увидеть только те файлы, которые являются чисто ASCII являются 5.txt, 9.xml и A-C. Остальные либо двоичные, либо UTF в соответствии с file
.
Вы можете использовать шарик Bash для прокрутки файлов и использовать file
для проверки каждого файла. Это сохранить того, чтобы разобрать вывод file
для имен файлов, но полагается на file
для точной идентификации того, что вы считаете «текст»:
for fn in *; do
[ -f "$fn" ] || continue
fo=$(file "$fn")
[[ $fo =~ ^"$fn":.*text ]] || continue
echo "$fn"
done
Если вы не можете использовать file
, что, безусловно, самый простой способ, вы может открыть файл и искать двоичные символы. Использование Perl для этого:
for fn in *; do
[ -f "$fn" ] || continue
head -c 2000 "$fn" | perl -lne '$tot+=length; $cnt+=s/[^[:ascii:]]//g; END{exit 1 if($cnt/$tot>0.03);}'
[ $? -eq 0 ] || continue
echo "$fn"
done
В этом случае я ищу процент против, не ASCII ASCII в первые 2000 байт файла. YMMV, но это позволяет найти файл, который file
будет сообщать как UTF (так как он имеет двоичную спецификацию), но большая часть файла - ascii.
Для этого каталога, отчет два Bash скрипты (с моими комментариями по каждому файлу):
1.txt # UTF file with a binary BOM but no UTF characters -- all ascii
4.dat # text based configuration file for a router. file does not report this
5.txt # Pure ascii file
7.html # html file
8.js # Javascript sourcecode
9.xml # xml file all text
A.pl # Perl file
B.Makefile # Unix make file
C.c # C source file
Поскольку file
не учитывает все ASCII-файл 4.dat
быть текст, он не сообщил первый Bash, но второй. В противном случае - тот же вывод.
Использование [подстановочных знаков] (http://www.linfo.org/wildcard.html) – myaut
'ls * .txt' должно делать трюк. –
@ILikeTau Где вы видите расширения .txt в его содержимом? – Barmar