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

<p>если я использую команду <code>find</code> следующим образом:</p><pre><code>find /mydir/mysubdir -executable -type f </code></pre><p>перечислены все исполняемые файлы (кроме каталогов), включая файл исполняемого скрипта (например, script.sh и т. д.). что я хочу сделать, это перечислить только двоичные исполняемые файлы.</p>

<p>вы можете попробовать утилиту <code>file</code>. согласно справочной странице:</p><blockquote> <p>магические тесты используются для проверки файлов с данными в определенных фиксированных форматах. каноническим примером этого является двоичный исполняемый файл (скомпилированная программа) a.out, формат которого определен в и, возможно, в стандартном каталоге include.</p> </blockquote><p>возможно, вам придется поиграть с регулярным выражением, но что-то вроде:</p><pre><code>$ find -type f -executable -exec file -i '{}' ; | grep 'x-executable; charset=binary' файл имеет много опций, поэтому вы можете поближе взглянуть на справочную страницу. я использовал первый вариант, который, как мне показалось, выдает вывод, который легко выводить на экран.

вот способ исключить сценарии, то есть файлы, первые два символа которых являются #!:find -type f -executable -exec sh -c 'test "$(head -c 2 "$1")" != "#!"' sh {} ; -print для некоторых типов файлов неясно, хотите ли вы, чтобы они классифицировались как скрипты или двоичные файлы, например, файлы байт-кода. в зависимости от того, как все настроено, они могут начинаться или не начинаться с #!. если это важно для вас, вам придется сделать внутренний сценарий shell более сложным. например, вот как вы можете включить двоичные файлы elf и исполняемые файлы mono и программы байт-кода objective caml, но не другие виды исполняемых файлов, такие как сценарии shell или 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 </code></pre>

<p>на тот случай, если вы окажетесь в системе с уровнем нижнего уровня <code>find</code> (как я пишу, все еще существует множество научных кластеров под управлением rhel5!) без прав на обновление: вместо</p><pre><code>find /mypath/ -executable -type f </code></pre><p>в приведенных выше отличных ответах вы можете сделать, например,</p><pre><code>find /mypath/h -type f -perm -u+x </code></pre><p>который ищет биты разрешения. к сожалению, вышесказанное находит только файлы, для которых у пользователя есть исполняемый файл, но это обычно работает для меня.</p>