Як знайти всі бінарні виконувані файли рекурсивно в каталозі?


46

Якщо я використовую findтаку команду:

find /mydir/mysubdir -executable -type f

перелічуються всі виконувані файли (крім каталогів), включаючи виконуваний файл сценарію (наприклад, script.sh тощо). Що я хочу зробити, це перелік лише бінарних виконуваних файлів.


1
Будь ласка, змініть тему, щоб вона включала слово "двійкове", яке є ключовим для відповіді на ваше запитання.
Стефан Ласєвський

Відповіді:


44

Ви можете спробувати fileутиліту. За даними сторінки:

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

Можливо, вам доведеться пограти з регулярним виразом, але щось на кшталт:

$ 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. Він дасть вам лише файли (і таким чином може бути переданий до наступної команди, яку він хоче запустити)
Герт

Рішення serverfault.com/a/584595/211551 знаходить файли, які НЕ позначені виконуваними, але є виконуваними.
користувач2067125

В 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 та об'єктивні програми байт-коду 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

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


Це все ще знайде виконувані сценарії, а не лише бінарні файли.
Kusalananda
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.