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

46

Если я использую findкоманду, как это:

find /mydir/mysubdir -executable -type f

перечислены все исполняемые файлы (кроме каталогов), включая файл исполняемого скрипта (например, script.sh и т. д.). Что я хочу сделать, это перечислить только двоичные исполняемые файлы.

Урай
источник
1
Пожалуйста, измените тему, чтобы включить слово «двоичный», который является ключевым для ответа на ваш вопрос.
Стефан Ласевский

Ответы:

44

Вы можете попробовать fileутилиту. Согласно справочной странице:

Магические тесты используются для проверки файлов с данными в определенных фиксированных форматах. Каноническим примером этого является двоичный исполняемый файл (скомпилированная программа) a.out, формат которого определен в и, возможно, в стандартном каталоге include.

Возможно, вам придется поиграть с регулярным выражением, но что-то вроде:

$ find -type f -executable -exec file -i '{}' \; | grep 'x-executable; charset=binary'

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

Стивен Д
источник
15
Я бы сказал, использовать find -type f -executable -exec sh -c "file -i '{}' | grep -q 'x-executable; charset=binary'" \; -print. Он даст вам только файлы (и, следовательно, может быть передан следующей команде, которую он хочет запустить)
Gert
Решение serverfault.com/a/584595/211551 находит файлы, которые НЕ помечены как исполняемые, но являются исполняемыми.
user2067125
В OS X вы можете установить GNU findс помощью brew install findutilsили, sudo port install findutilsа затем запустить такой вызов с аналогичным эффектом:gfind . -type f -executable -exec file '{}' \; | grep -i execut
GDP2
7

Вот способ исключить сценарии, то есть файлы, первые два символа которых #!:

find -type f -executable -exec sh -c 'test "$(head -c 2 "$1")" != "#!"' sh {} \; -print

Для некоторых типов файлов неясно, хотите ли вы, чтобы они классифицировались как скрипты или двоичные файлы, например, файлы байт-кода. В зависимости от того, как все настроено, они могут начинаться или не начинаться #!. Если это важно для вас, вам придется сделать скрипт внутренней оболочки более сложным. Например, вот как вы можете включить двоичные файлы ELF и исполняемые файлы Mono и программы байт-кода Objective Caml, но не другие виды исполняемых файлов, такие как сценарии оболочки или сценарии perl или программы байт-кода JVM:

find -type f -executable -exec sh -c '
    case "$(head -n 1 "$1")" in
       ?ELF*) exit 0;;
       MZ*) exit 0;;
       #!*/ocamlrun*) exit 0;;
    esac
    exit 1
' sh {} \; -print
Жиль "ТАК - перестань быть злым"
источник
2

На тот случай, если вы окажетесь в системе с более низким уровнем find(как я пишу, все еще существует множество научных кластеров под управлением RHEL5!) Без прав на обновление: вместо

find /mypath/ -executable -type f

в приведенных выше отличных ответах вы можете сделать, например,

find /mypath/h -type f -perm -u+x

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

TomRoche
источник
Это все равно найдет исполняемые скрипты, а не только двоичные файлы.
Кусалананда