Linux + проверить, является ли файл текстовым или двоичным - PullRequest
6 голосов
/ 07 сентября 2010

Как я могу проверить, является ли файл двоичным или текстовым без открытия файла?

Ответы [ 5 ]

9 голосов
/ 07 сентября 2010

Кот Шредингера, боюсь.

Нет способа определить содержимое файла, не открывая его.Файловая система не хранит метаданные, относящиеся к содержимому.

Если закрытие файла не является жестким требованием, то для вас есть ряд решений.

Изменить:

В ряде комментариев и ответов было высказано предположение, что file(1) является хорошим способом определения содержания.Это действительно так.Однако file(1) открывает файл, который был запрещен в вопросе.Смотрите предпоследнюю строку в следующем примере:

> echo 'This is not a pipe' > file.jpg && strace file file.jpg 2>&1 | grep file.jpg
execve("/usr/bin/file", ["file", "file.jpg"], [/* 56 vars */]) = 0
lstat64("file.jpg", {st_mode=S_IFREG|0644, st_size=19, ...}) = 0
stat64("file.jpg", {st_mode=S_IFREG|0644, st_size=19, ...}) = 0
open("file.jpg", O_RDONLY|O_LARGEFILE)  = 3
write(1, "file.jpg: ASCII text\n", 21file.jpg: ASCII text
7 голосов
/ 07 сентября 2010

Правильный способ определения типа файла - использовать команду file (1).

Вам также необходимо знать, что файлы в кодировке UTF-8 являются «текстовыми» файлами, но могут содержатьданные не в формате ASCII.Другие кодировки также имеют эту проблему.В случае текста, закодированного с помощью кодовой страницы , может быть невозможно однозначно определить, является ли файл текстовым или нет.

Команда file (1) рассмотрит структуруфайла, чтобы попытаться определить, что он содержит - из справочной страницы file (1):

Тип напечатанного файла обычно содержит одно из слов text (файл содержит только печатные символы и несколько общих управляющих символов и, вероятно, безопасен для чтения на терминале ASCII), исполняемый файл (файл содержит результат компиляции программыв форме, понятной какому-либо ядру UNIX или другому), или data , означающей что-либо еще (данные обычно являются «двоичными» или не распечатываются).

Что касается различных кодировок символов, на справочной странице file (1) есть следующее:

Если файл не соответствует ни одной из записей в магическом файле, он проверяется,это похоже на текстовый файл.Наборы символов ASCII, ISO-8859-x, 8-разрядные расширенные ASCII, отличные от ISO (например, используемые в системах Macintosh и IBM PC), кодировка Unicode в кодировке UTF-8, кодировка Unicode в кодировке UTF-16 и символы EBCDICмогут отличаться различными диапазонами и последовательностями байтов, которые составляют печатный текст в каждом наборе.Если файл проходит какой-либо из этих тестов, сообщается его набор символов.Файлы ASCII, ISO-8859-x, UTF-8 и расширенный ASCII идентифицируются как «текстовые», поскольку они будут в основном читаемы практически на любом терминале;UTF-16 и EBCDIC являются только «символьными данными», потому что, хотя они и содержат текст, для его чтения требуется текст, который требуется перевести.

Таким образом, некоторый текст будет идентифицирован как текст , но некоторые могут быть идентифицированы как символьные данные .Вам нужно будет самостоятельно определить, имеет ли это значение для вашего заявления, и предпринять соответствующие действия.

2 голосов
/ 07 сентября 2010

В Unix файл - это всего несколько байтов.Таким образом, не открывая файл, вы не можете определить, на 100%, что это ASCII или Binary.

Вы можете просто использовать доступные вам инструменты и копать глубже, чтобы сделать его надежным.

  1. file
  2. cat -v
2 голосов
/ 07 сентября 2010

Если вы пытаетесь сделать это из командной оболочки, то команда file определит, какой это тип файла.Если это текст, то он обычно включает слово text в своем описании.

Я не знаю ни одного 100% метода определения этого, но команда file, вероятно, является наиболее точной.

2 голосов
/ 07 сентября 2010

Невозможно быть уверенным, не заглянув внутрь файла.Тем не менее, вам не нужно открывать его в редакторе и убедиться, что у вас есть подсказка.Вы можете посмотреть на команду file: http://linux.die.net/man/1/file

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...