139

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

6 ответов6

142

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

find <dir> -executable

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

find <dir> -executable -type f
30

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

find . -perm /u=x,g=x,o=x

Редактировать:

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

find . -executable

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

12

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

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

find . -perm +111 -type f
3

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

for i in `find -type f`; do [ -x $i ] && echo "$i is executable"; done

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

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

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

2

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

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

find ./ -type f -name "*" -not -name "*.o" -exec sh -c '
    case "$(head -n 1 "$1")" in
      ?ELF*) exit 0;;
      MZ*) exit 0;;
      #!*/ocamlrun*)exit0;;
    esac
exit 1
' sh {} \; -print
1

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

find /usr/bin -executable -type f -print0 | xargs file | grep ASCII

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

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

echo -n "+ Identifying script files owned by root that execute and have an eval in them..."
find /  -not \( -path /proc -prune \)  -type f -executable -user root -exec grep -l eval {} \; -exec file {} \; | grep ASCII| cut -d ':' -f1 > $outputDir"/root_owned_scripts_with_eval.out" 2>/dev/null &

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .