Как я могу найти только исполняемые файлы в определенной директории в Linux?
6 ответов
Проверить наличие исполняемых файлов можно с помощью -perm
(не рекомендуется) или -executable
(рекомендуется, так как это учитывает ACL). Чтобы использовать опцию -executable
:
find <dir> -executable
если вы хотите найти только исполняемые файлы, а не каталоги с возможностью поиска, объедините их с -type f
:
find <dir> -executable -type f
Используйте параметр поиска -perm
. Это найдет файлы в текущем каталоге, которые могут быть выполнены их владельцем, членами группы или другими:
find . -perm /u=x,g=x,o=x
Редактировать:
Я просто нашел другой вариант, который присутствует по крайней мере в GNU find 4.4.0:
find . -executable
Это должно работать даже лучше, потому что списки ACL также рассматриваются.
Я знаю, что в этом вопросе конкретно упоминается Linux, но поскольку это первый результат в Google, я просто хотел добавить ответ, который искал (например, если вы - как я в данный момент - вынуждены использовать ваш работодатель не GNU) Система Linux).
Протестировано на macOS 10.12.5
find . -perm +111 -type f
У меня есть другой подход, в случае, если вы действительно хотите что-то сделать с исполняемыми файлами - и не обязательно фактически заставлять find фильтровать себя:
for i in `find -type f`; do [ -x $i ] && echo "$i is executable"; done
Я предпочитаю это, потому что он не зависит от -executable
который зависит от платформы; и он не полагается на -perm
который является немного загадочным, немного специфичным для платформы, и, как написано выше, требует, чтобы файл был исполняемым для всех (не только для вас).
-type f
важен, потому что каталоги * nix должны быть исполняемыми, чтобы их можно было обойти, и чем больше запросов находится в команде find
, тем эффективнее будет память для вашей команды.
В любом случае, просто предлагая другой подход, поскольку * nix - это страна миллиардов подходов.
Файл, помеченный как исполняемый, не обязательно должен быть исполняемым или загружаемым файлом или объектом.
Вот что я использую:
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
Как поклонник одного лайнера ...
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 &