it-swarm-ru.tech

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

Если я использую команду find следующим образом:

find /mydir/mysubdir -executable -type f

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

48
uray

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

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

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

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

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

45
Steven D

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

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
7
Gilles 'SO- stop being evil'

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

find /mypath/ -executable -type f

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

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

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

2
TomRoche