Найти все исполняемые файлы в папке в терминале

19

У меня есть папка, myfolderкоторая содержит огромную иерархию файлов / папок.
Как найти все исполняемые файлы в этой папке?

На Ubuntu это работает: find . -executable -type f

Но Mac OS X Mavericks (который также использует bash) не может получить его:

find: -executable: unknown primary or operator
Николас Рауль
источник

Ответы:

29

Это найдет все файлы (не символические ссылки) с установленным исполняемым битом:

find . -perm +111 -type f

Это также найдет символические ссылки (которые часто одинаково важны)

find . -perm +111 -type f -or -type l

Вот как работает команда, если она не очевидна:

  • find очевидно, программа поиска (:
  • .ссылается на каталог, в котором нужно начать поиск ( .= текущий каталог)
  • -perm +111= с любым из установленных исполняемых битов ( +означает «любой из этих битов», 111является восьмеричным для исполняемого бита для владельца, группы и любого другого)
  • -type fозначает, что тип является файлом
  • -or логическое ИЛИ
  • -type lозначает, что тип является символической ссылкой
drfrogsplat
источник
2
Вы можете использовать -Lвместо того, -or -type lчтобы любые statвызовы findвозвращали статистику файла, на который ссылается, а не саму ссылку.
Ян С.
Проблема, которую я обнаружил при таком подходе, заключается в том, что любой файл может иметь разрешение на запуск. Например, после загрузки какого-либо текстового файла из Windows разрешение нарушается.
Иван З. Сяо
5

Я не смог заставить работать ответ Яна (10.6.8), но следующее дало ожидаемые результаты:

find . -type f -perm +0111 -print

редактировать обновление

Кажется, это тоже работает!

find . -type f -perm +ugo+x -print

Я предполагаю, что "x" не имеет смысла без спецификаторов user / group / other.

Кент
источник
Символьный синтаксис должен быть новым - спасибо за указание на это. Я обновил свой ответ, чтобы он использовал восьмеричные числа и был обратно совместим со старыми версиями OS X.
Ян С.
Как ни странно, этот раздел man-страницы 10.6 в точности совпадает с тем, что вы цитировали… этого было достаточно, чтобы заставить меня копнуть немного глубже и посмотреть, что, черт возьми, происходит. Изменен мой ответ выше.
Кент
2
Вывод: синтаксис команды BDS странный.
Ян С.
3

Со страницы руководства для поиска в OS X :

 -perm [-|+]mode
         The mode may be either symbolic (see chmod(1)) or an octal number.  If the mode is symbolic, a
         starting value of zero is assumed and the mode sets or clears permissions without regard to the
         process' file mode creation mask.  If the mode is octal, only bits 07777 (S_ISUID | S_ISGID |
         S_ISTXT | S_IRWXU | S_IRWXG | S_IRWXO) of the file's mode bits participate in the comparison.
         If the mode is preceded by a dash (``-''), this primary evaluates to true if at least all of
         the bits in the mode are set in the file's mode bits.  If the mode is preceded by a plus
         (``+''), this primary evaluates to true if any of the bits in the mode are set in the file's
         mode bits.  Otherwise, this primary evaluates to true if the bits in the mode exactly match the
         file's mode bits.  Note, the first character of a symbolic mode may not be a dash (``-'').

Итак, вам нужно:

find . -type f -perm +0111 -print

Помните, что OS X основана на BSD , а не на Linux, поэтому команды Gnu, к которым вы привыкли в дистрибутивах Linux ( findодним из них), не обязательно совпадают с тем, что есть в OS X. Это не так разница в оболочке, это разница между утилитами операционной системы и операционной системы.

Ян С.
источник
1

Я знаю очень старый вопрос, но в поисках решения я, возможно, нашел лучший ответ.

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

MacOS поставляется с небольшим удобным инструментом командной строки " file", который отображает информацию о файле, например:

$> file *

Distribution:             directory
SomeFile.icns:            Mac OS X icon, 3272878 bytes, "ic09" type
MyPicture.png:            PNG image data, 1024 x 1024, 8-bit/color RGBA, non-interlaced
NSHelpers.pas:            Algol 68 source text, ASCII text
myProgram:                Mach-O 64-bit executable x86_64

Как вы можете видеть, MyProgram - это исполняемый файл, который хорошо обозначен как таковой. Поскольку в старых 32-битных исполняемых файлах также будет присутствовать фраза «исполняемый файл», следующее должно перечислить все истинные исполняемые файлы (двоичные файлы):

file * | grep "executable"

Надеюсь, что это будет полезно для тех, кто ищет ответ на тот же вопрос.

Примечание: fileпохоже, нет функции для просмотра через подкаталоги.

Hanzaplastique
источник