5

В линуксе

Я знаю, что могу find . -type f , но это включает двоичный файл, и я не смог найти способ исключить их с помощью find

6 ответов6

7

Например, file /usr/bin/file не включает слово "двоичный" в свой вывод в моей системе. Если file -i доступен, он включает слово "двоичный". Без -i может быть более надежным проверить наличие слова "текст".

find -type f -exec sh -c "file {} | grep text >/dev/null" \; -print

или же

find -type f -exec sh -c "file {} | grep text >/dev/null" \; -ls

Использование -i:

find -type f -exec sh -c "file -i {} | grep -v binary >/dev/null" \; -print

Использование file будет только приблизительным, поскольку он использует эвристику для определения типа файла, и нет точного определения того, что представляет собой "двоичный" файл. Является ли пустой файл "двоичным"? file говорит, что это так. Кроме того, существует множество (обычно необычных) способов запуска ложных положительных идентификаторов по file .

3

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

find . -type f ! -perm /u=x,g=x,o=x

(Если двоичный файл равен разрешению на выполнение ...)

0

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

ls -l | awk '{if ($1 !~ /x/) print $8}'
0

Попробуйте следующую команду:

find . -type f -exec file "{}" \; | grep -vE "ELF|archive"
0

Пример использования Python и оболочки:

IS_BINARY='import sys; sys.exit(not b"\x00" in open(sys.argv[1], "rb").read())'
find . -type f -exec bash -c "python -c '$IS_BINARY' {} || echo {}" \;

Ключевой элемент находится в:

b"\x00" in open("foo.bar", "rb").read()

который проверяет, имеет ли файл символ NULL.

0

Если вы имеете в виду обычные файлы, которые в основном не содержат символов NULL, попробуйте использовать GNU grep:

grep -PaLr '\x00' .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .