В линуксе
Я знаю, что могу find . -type f
, но это включает двоичный файл, и я не смог найти способ исключить их с помощью find
Например, 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
.
Другим способом было бы исключить все файлы, которые имеют права доступа на выполнение для пользователя, группы или других пользователей:
find . -type f ! -perm /u=x,g=x,o=x
(Если двоичный файл равен разрешению на выполнение ...)
показать все файлы без прав на выполнение (хотя это не двоичный файл, поэтому он может быть не совсем тем, что вам нужно):
ls -l | awk '{if ($1 !~ /x/) print $8}'
Попробуйте следующую команду:
find . -type f -exec file "{}" \; | grep -vE "ELF|archive"
Пример использования 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.
Если вы имеете в виду обычные файлы, которые в основном не содержат символов NULL, попробуйте использовать GNU grep
:
grep -PaLr '\x00' .