Linux find only executables

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

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

Проверка наличия исполняемых файлов может быть выполнена с -perm (не рекомендуется) или -executable (рекомендуется, так как это учитывает ACL). Чтобы использовать -executable опцию:

если вы хотите найти только исполняемые файлы, а не каталоги с возможностью поиска, объедините их с -type f :

Используйте -perm опцию поиска . Это найдет файлы в текущем каталоге, которые могут быть выполнены их владельцем, членами группы или другими:

Я просто нашел другой вариант, который присутствует по крайней мере в GNU find 4.4.0:

Это должно работать даже лучше, потому что списки ACL также рассматриваются.

Я знаю, что в этом вопросе конкретно упоминается Linux, но, поскольку это первый результат в Google, я просто хотел добавить ответ, который искал (например, если вы — как и я — в данный момент — вынуждены вашим работодателем использовать не GNU) Система Linux).

Протестировано на macOS 10.12.5

У меня есть другой подход, в случае, если вы действительно хотите что-то сделать с исполняемыми файлами — и не обязательно фактически заставлять find фильтровать себя:

Я предпочитаю это, потому что это не зависит от -executable конкретной платформы; и он не полагается на то, -perm что является немного загадочным, немного специфичным для платформы, и, как написано выше, требует, чтобы файл был исполняемым для всех (не только для вас).

Это -type f важно, потому что каталоги * nix должны быть исполняемыми, чтобы их можно было обойти, и чем больше в команде запросов find , тем эффективнее будет ваша команда.

Во всяком случае, просто предлагая другой подход, поскольку * nix — это страна миллиардов подходов.

Файл, помеченный как исполняемый, не обязательно должен быть исполняемым или загружаемым файлом или объектом.

Вот что я использую:

Как поклонник одного лайнера .

Использование ‘xargs’ для получения вывода команды find (использование print0 для обеспечения правильной обработки имен файлов с пробелами). Теперь у нас есть список исполняемых файлов, и мы предоставляем их один за другим в качестве параметра команды file. Затем grep для термина ASCII, чтобы игнорировать двоичные файлы. Пожалуйста, замените -executable в команде find тем, какой стиль вы предпочитаете (см. Предыдущие ответы) или что работает в вашей ‘NIX OS

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

/.bashrc Сегодня вечером я создал функцию для поиска исполняемых файлов не по системному пути и не по каталогам:

Преимущество состоит в том, что он будет искать три дистрибутива Linux и установку Windows менее чем за секунду, где find команда занимает 15 минут.

Или для всего каталога и всех его подпрограмм:

Источник

Unix find: поиск исполняемых файлов

какой тип параметра / флага я могу использовать с Unix find команда, чтобы я искал исполняемые файлы?

9 ответов

на GNU версии find вы можете использовать -executable :

для версий BSD find вы можете использовать -perm С + и восьмеричную маску:

в этом контексте » + «означает» любой из этих битов установлен», а 111-это исполняемые биты.

Читайте также:  Amd atombios driver windows

обратите внимание, что это не идентично -executable предикат в GNU find. В частности, -executable проверяет, что файл может быть выполнен текущим пользователем, в то время как -perm +111 просто тесты, Если они выполняются разрешения установлены.

старые версии GNU find также поддерживают -perm +111 синтаксис, а как 4.5.12 этот синтаксис не поддерживается. Вместо этого, вы можете использовать -perm /111 чтобы получить такое поведение.

кончик шляпы @gniourf_gniourf для прояснения фундаментального заблуждения.

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

Поиск исполняемых файлов может см.два разных варианта использования:

  • пользователя найти файлы исполняемый файл текущим пользователем.
  • найти файлы (один или несколько) исполняемые биты разрешений set.

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

обратите внимание, что самый простой файл-ориентированный случай-поиск исполняемых файлов с битом исполняемых разрешений, установленным для всех трех участников безопасности (пользователь, группа, Другие) — будет обычно, а не обязательно дают те же результаты, что и ориентированный на пользователя сценарий-и важно понимать разница.

ориентированных на пользователя ( -executable )

The принято отвечать похвально рекомендует -executable , если GNU find доступно.

  • GNU find входит в состав большинства Linux дистрибутивы
    • напротив, платформы на основе BSD, включая macOS, поставляются с BSD find, который менее мощный.
  • как сценарий требует, -executable матчи только файлы настоящее выполнить (есть крайние случаи. [1] ).

The BSD find альтернатива, предлагаемая принятым ответом ( -perm +111 ) отвечает a разные, -ориентированной вопрос (как говорится в самом ответе).

    используя -perm чтобы ответить на пользователей-ориентированной вопрос невозможно, потому что необходимо относятся the файла идентификатор пользователя и группы в текущего пользователя, а -perm можно проверить только файла разрешения.
    Использование только POSIX find особенности, на вопрос нельзя ответить без привлечения внешних коммунальные услуги.

таким образом, лучшие -perm можно сделать (сам по себе) — это приближение of -executable . возможно ближе приближение, чем -perm +111 is -perm -111 , чтобы найти файлы, которые имеют исполняемый бит, установленный для всех участников безопасности (пользователь, группа, Другие) — это поражает меня как типичный сценарий реального мира. В качестве бонуса он также совместим с POSIX (используйте find -L включить символические ссылки, см. далее ниже для объяснения):

gniourf_gniourf это предоставляет true, портативный эквивалент -executable , используя -exec test -x <> \; , хотя и за счет производительности.

объединение -exec test -x <> \; С -perm +111 (т. е. файлы с по крайней мере один исполняемый бит set) может помочь производительность в этом exec не нужно вызывать для каждый файл (ниже используется POSIX-совместимый эквивалент BSD find -perm +111 / GNU find -perm /111 ; см. далее ниже для объяснения):

  • до ответ -ориентированной вопросы, это isдостаточно для использования POSIX-совместимого -perm первичный (известный как тест в GNU найти терминологию).
    • -perm позволяет проверить любой права доступа к файлам, а не только исполняемость.
    • разрешения указываются каквосьмеричной или символические режимы. Восьмеричные режимы-это восьмеричные числа (например, 111 ), тогда как символьные режимы являются строками (например, a=x ).
    • символические режимы определить субъекты безопасности как u (пользователь), g (группа) и o (другие), или a для обозначения всех трех. Разрешения выражаются как x для исполняемого файла, например, и назначается Принципалам с помощью операторов = , + и — ; на полное обсуждение, в том числе восьмеричных режимов, см. спецификация POSIX для chmod утилиты.
    • в контексте find :
      • префикс режима с — (например, -ug=x ) означает: сопоставьте файлы, которые имеют все разрешения указано (но соответствующие файлы могут иметь дополнительные разрешения).
      • с нет префикса (например, 755 ) означает: сопоставьте файлы, которые имеют это полное и точное набор разрешений.
      • предостережение: как GNU find и BSD find реализовать дополнительные, нештатное префикс с какие-либо из указанного-разрешение-бит-набор логики, а с несовместимый синтаксис:
        • BSD найти: +
        • GNU find: / [2]
      • таким образом, избегайте этих расширений, если ваш код должен быть портативный.
  • примеры ниже демонстрируют портативные ответы на различные вопросы, ориентированные на файл.

    примеры команд, ориентированных на файл

    • следующее примеры POSIX-совместимые, что означает, что они должны работать в любой POSIX-совместимой реализации, включая GNU find и BSD find; в частности, это требует:
      • не использовать нестандартные префиксы режима + или / .
      • использование форм POSIX праймериз логических операторов:
        • ! for NOT (GNU find и BSD find также позволяют -not ); обратите внимание, что \! используется в примерах, чтобы защитить ! из истории разложения оболочки
        • -a Для и (GNU find и BSD find также позволяют -and )
        • -o Для или (GNU find и BSD find также позволяют -or )
    • примеры использования символическое режимы, потому что их легче читать и запоминать.
      • с префиксом режим — , the = и + операторы можно использовать взаимозаменяемо (например, -u=x эквивалентно -u+x — если вы не применяете -x позже, но нет смысла делать что.)
      • использовать , присоединиться к частичным режимам; и логика подразумевается; например, -u=x,g=x означает, что пользователь и должен быть установлен исполняемый бит группы.
      • режимы не могут сами выразить отрицательное соответствие в смысле «совпадение только если этот бит не установлен»; вы должны использовать отдельный -perm выражение С не основным, ! .
    • обратите внимание, что найти тут праймериз (например, -print или -perm ; также известный как действия и тесты в GNU найти) являются имплицитно вместе с -a (логическое И), и -o и, возможно, скобки (escaped as \( и \) для оболочки) необходимы для реализации логики или.
    • просто find . используется для того, чтобы соответствовать символические ссылки на экзешники
      • -L поручает найти чтобы оценить цели символических ссылок вместо самих символических ссылок; поэтому без -L , -type f будет полностью игнорировать символические ссылки.

    [1] Описание -executable С man find по состоянию на GNU найти 4.4.2:

    соответствует файлам, которые являются исполняемыми, и каталогам, которые доступны для поиска (в смысле разрешения имен файлов). Это учитывает доступ контрольные списки и другие артефакты разрешений, которые игнорирует тест-perm. Этот тест использует системный вызов access (2) , и поэтому может быть обманутые серверами NFS, которые выполняют сопоставление UID (или root-squashing), поскольку многие системы реализуют access (2) в ядре клиента и поэтому не могут используйте информацию сопоставления UID, хранящуюся на сервере. Поскольку этот тест основан только на результате системного вызова access (2), там никакой гарантии, что файл, для которого этот тест выполняется успешно, может быть фактически выполнен.

    [2] GNU найти версии старше 4.5.12 также допускается префикс + , но это было сначала устарело и в конечном итоге удалено, потому что объединение + С символическое режимы дают, вероятно, неожиданные результаты из-за интерпретации как точно маска разрешения. если вы (a) запускаете версию до 4.5.12 и (b) ограничьтесь восьмеричной только режима, вы мог бы уйти с использованием + С и GNU find и BSD find, но это не очень хорошая идея.

    Источник

    How find only executable files using ‘locate’?

    locate gtags would find all the files named gtags .

    What if I only need executables, is there any way to do this?

    3 Answers 3

    Not easily. You can use

    to find all executables where the name contains bash . This is faster than using find across the whole filesystem because only a few files need to be checked.

    • locate bash does what it always does (lists all matches)
    • | (pipe) takes the output from the first command ( locate ) and sends it to the second one (the rest of the line)
    • the while . ; do . done loop iterates over every line it receives from the pipe (from locate )
    • read -r line reads one line of input and stores it in a variable called line (in our case, a path/file name)
    • [[ -x «$line» ]] tests whether the file in $line is executable
    • if it is, the && echo $line part prints it on your screen

    The fastest and least expensive solution:

    According to the xargs man page, the above syntax passes all filenames found by locate to a single execution of find , which examines only the specified files.

    This solution is better than those given previously because:

    • Using find to search every file on the system beginning with the root directory may be a short command, but it could take a very long time to run.
    • Using a shell while-loop to check each filename can be slow, because it checks each file one at a time.

    Since others have asked for detailed explanations of the parameters given in earlier answers, the details are:

    • locate (See: Invoking locate — Finding Files)
      • -b : Match only the base filename of the pathname against the specified patterns, don’t consider the names of the directories in the pathname.
      • \ : Since the backslash is a globbing character, it prevents locate from treating the pattern, gtags , as though it were *gtags* . I.e., it looks for files that have the exact name «gtags» without other characters before or after.
    • xargs (See: xargs options — Finding Files)
      • -r : If the standard input is completely empty, do not run the command.
      • -i : Substitute <> in the following command with the list of filenames read from standard input.
    • find (See: find Primary Index — Finding Files)
      • <> : xargs substitutes this with the names of all the files it receives from locate on standard input. find searches all of those files for matches to the following expressions and if any of them are directories, it examines the contents of them, too.
      • -prune : If a filename being evaluated belongs to a directory, don’t search its contents.
      • -type f : Include in the output only filenames that belong to «regular» files, not special ones like devices, named pipes, etc.
      • -executable : Include in the output only filenames of executable files. That is, those with one or more of their executable mode bits set, regardless of the file content.

    In short, locate prints the names of matching files to standard output, which is piped (using | ) into the standard input of xargs . xargs reads the filenames from standard input and combines them into a space-delimited list in a single string. If the string is not empty, xargs substitutes the string for <> in the find command before executing it.

    Источник

    Читайте также:  Кмс нано windows 10
Оцените статью