Знайдіть всі виконувані файли в папці в терміналі


19

У мене папка, myfolderяка містить величезну ієрархію файлів / папок.
Як знайти всі виконувані файли в цій папці?

У Ubuntu це працює: find . -executable -type f

Але Mac OS X Mavericks (який також використовується bash) не вдається отримати це:

find: -executable: unknown primary or operator

Відповіді:


30

Тут знайдуться всі файли (а не посилання) з набором виконуваного біта:

find . -perm +111 -type f

Це також знайде посилання (які часто однаково важливі)

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

Ось як працює команда, якщо її не очевидно:

  • find це, очевидно, програма пошуку (:
  • .посилається на каталог для початку пошуку в ( .= поточний каталог)
  • -perm +111= з будь-яким із наборів виконуваних бітів ( +означає "будь-який з цих бітів", 111вісімка для виконуваного біта для власника, групи та будь-кого)
  • -type fозначає тип - файл
  • -or булева АБО
  • -type lозначає тип символічне посилання

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" є безглуздим без специфікаторів користувача / групи / інших.


Символічний синтаксис повинен бути новим - дякую, що вказали на це. Я оновив свою відповідь, щоб вона використовувала восьмерики та назад сумісна зі старими версіями OS X.
Ян Ч.

Як не дивно, що той розділ сторінки 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схоже, не має функції повторюватись через підкаталоги.

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