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

158087
HaiYuan Zhang

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

129
Вот что-то вроде BASH-скрипта, это неплохо, вот что я могу сказать :) http://stackoverflow.com/a/20209457/2067125 AjayKumarBasuthkar 10 лет назад 0
Как насчет использования стандартной команды [`file`] (http://en.wikipedia.org/wiki/File_%28command%29)? Breakthrough 9 лет назад 0
Для тех, кто хочет сделать это на ** Mac ** (протестировано на OS X 10.9.5): `ls -l | egrep '^ [^ d] .. x..x..x. * $' `Выше перечислены все исполняемые файлы (для всех / пользователя и группы) в текущем каталоге. * Примечание *: опция `-executable` не работает на Mac, поэтому это обходной путь, описанный выше. techfoobar 9 лет назад 4
Также актуально: [Unix find: поиск исполняемых файлов] (http://stackoverflow.com/questions/4458120/unix-find-search-for-executable-files) Slothworks 8 лет назад 0
@techfoobar: Вопрос двусмысленный: это файлы, которые содержат исполняемый код, или файлы, которые имеют разрешение на выполнение? Но даже если мы предположим, что разрешение на исполняемый файл - это то, что нужно (как кажется большинству ответов), вопрос не говорит о ** исполняемом мире **. Ваше решение найдет файлы (а также fifos, сокеты, символические ссылки и т. Д.), Которые имеют разрешение на выполнение в мире, но не 750 (`-rwxr-x ---`), который по-прежнему может выполняться некоторыми пользователями. G-Man 8 лет назад 1

6 ответов на вопрос

134
knittl

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

find <dir> -executable 

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

find <dir> -executable -type f 
Это вернет файлы только с включенным исполнением. Более тщательный анализ проверит наличие строки Шебанга или является ли файл двоичным 14 лет назад 0
Шебанг не означает, что они исполняемые. он говорит нам только, какой интерпретатор использовать. и по определению linux «исполняемые файлы» - это файлы с установленным битом исполняемого файла (x) knittl 14 лет назад 21
Какая версия find поддерживает этот тип для -type? Человек находит списки b, c, d, p, f, l, s и D в моей системе. innaM 14 лет назад 2
То же самое и в моей находке тоже нет `-type x`. davr 14 лет назад 2
Почему-то я всегда думаю, что "-type x" тоже подойдет. Я могу только предположить, что это было доступно на некотором аромате Unix, который я использовал однажды. Dave Webb 14 лет назад 0
@dave: рад слышать, что я не единственный :) knittl 14 лет назад 0
Если у вас есть старая версия find (вероятно, до 4.3.8), в которой отсутствует -executable, используйте find. -perm / u = x, g = x, o = x. Ludwig Weinzierl 13 лет назад 6
-исполняемый не переносимый и его следует избегать Good Person 11 лет назад 2
`find: неверный предикат -executable'` на RHEL SSH This 10 лет назад 6
29
innaM

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

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

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

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

find . -executable 

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

Это работает только на более новой версии find. По умолчанию в CentOS выдается ошибка `find: invalid mode` / u = x, g = x, o = x'` davr 14 лет назад 1
Затем вы должны попробовать версию "-perm +", которая в GNU find устарела: find. -пермь +111 " innaM 14 лет назад 9
Похоже, `-perm / 111` может быть самой переносимой версией. Scott 8 лет назад 0
8
friederbluemle

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

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

find . -perm +111 -type f 
Работает в RHEL 5 тоже. José Tomás Tocino 5 лет назад 1
3
Mark McKenna

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

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

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

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

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

(0) Что вы предпочитаете, тайное и правильное или интуитивное и ошибочное? Я предпочитаю правильно. (1) [ответ innaM] (http://superuser.com/a/39100/150988), в котором содержится `find -perm`, находит файлы с установленным битом разрешения * any *. (2) Напротив, этот ответ находит только файлы, для которых текущий пользователь имеет разрешение на выполнение. Конечно, это может быть тем, чего хочет ОП, но неясно. … (Продолжение) Scott 8 лет назад 0
(Продолжение)… (3) Для ясности вы можете изменить `\`… \ `` на `$ (…)` - см. [Это] (http://unix.stackexchange.com/q/5778 / 23408), [это] (http://unix.stackexchange.com/q/147838/23408) и [это] (http://unix.stackexchange.com/q/104119/23408). (4) Но не делайте `для меня в $ (найти ...); делать… `; это терпит неудачу на именах файлов, которые содержат пробел (ы). Вместо этого выполните `find… -exec…`. (5) И, когда вы работаете с переменными оболочки, всегда заключайте их в кавычки (в двойных кавычках), если у вас нет веских причин не делать этого, и вы уверены, что знаете, что делаете. Scott 8 лет назад 0
@scott Хорошо, я исправлен :) Я прочитал аргумент `-perm` как требующий все три, а не один из них. Кроме того, спасибо за вклад в защиту аргументов оболочки, это все, о чем я не знал. Mark McKenna 8 лет назад 0
@MarkMcKenna у вас есть опечатка там: `я в` найти. -тип f`; do [-x $ i] && echo "$ i - исполняемый файл"; done`; вам не хватает часть, которую я использую точку (.) Devy 7 лет назад 0
2
AjayKumarBasuthkar

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

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

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 
Что это делает? DerMike 9 лет назад 2
@DerMike, это один из способов найти исполняемый файл в текущем каталоге, включая файлы .so, даже если файл не помечен как исполняемый файл, который он может обнаружить. AjayKumarBasuthkar 9 лет назад 0
Ну, я имею в виду, _how_ это делает это? DerMike 9 лет назад 0
Это читает из заголовка файла, чтобы обнаружить, у каждого двоичного файла или файла сценария есть заголовок. AjayKumarBasuthkar 9 лет назад 0
Насколько я знаю, `-name" * "` не влияет на `find` - обычно он находит все файлы, которые не были удалены тестами. G-Man 8 лет назад 0
@AjayKumarBasuthkar вы знаете, что это не ответ на вопрос? вопрос заключался в том, как найти исполняемые файлы (= те, которые могут быть выполнены, = те, которые w / + x). Не так, как найти все файлы ELF, EXE и все-ocamlrun-is. nonchip 7 лет назад 0
1
Richard Braganza

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

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 & 
Это не сработает, если скрипт содержит не-ASCII символы. `file` сообщает о кодировке, поэтому скрипт на python может быть представлен как` a / usr / bin / python script, текстовый исполняемый код UTF-8 Unicode`. `найти ... | файл xargs -b | grep -v '^ ELF'` мог бы лучше определить недвоичные файлы. xenoid 6 лет назад 0

Похожие вопросы