вывести список/найти все обычные файлы во всех подкаталогах, за исключением двоичных файлов

вывести список/найти все обычные файлы во всех подкаталогах, за исключением двоичных файлов

В Linux.

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

решение1

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

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.

решение2

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

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

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

решение3

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

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

решение4

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

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

Связанный контент