Как я могу найти только исполняемые файлы в определенной директории в Linux?
158161
HaiYuan Zhang
Как я могу найти только исполняемые файлы в определенной директории в Linux?
Вот что-то вроде 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 9 лет назад
0
@techfoobar: Вопрос двусмысленный: это файлы, которые содержат исполняемый код, или файлы, которые имеют разрешение на выполнение? Но даже если мы предположим, что разрешение на исполняемый файл - это то, что нужно (как кажется большинству ответов), вопрос не говорит о ** исполняемом мире **. Ваше решение найдет файлы (а также fifos, сокеты, символические ссылки и т. Д.), Которые имеют разрешение на выполнение в мире, но не 750 (`-rwxr-x ---`), который по-прежнему может выполняться некоторыми пользователями.
G-Man 8 лет назад
1
Проверка на исполняемые файлы может быть выполнена с -perm(не рекомендуется) или -executable(рекомендуется, так как это учитывает ACL). Чтобы использовать -executableопцию:
find <dir> -executable
если вы хотите найти только исполняемые файлы, а не каталоги с возможностью поиска, объедините их с -type f:
find <dir> -executable -type f
Это вернет файлы только с включенным исполнением. Более тщательный анализ проверит наличие строки Шебанга или является ли файл двоичным
15 лет назад
0
Шебанг не означает, что они исполняемые. он говорит нам только, какой интерпретатор использовать. и по определению linux «исполняемые файлы» - это файлы с установленным битом исполняемого файла (x)
knittl 15 лет назад
21
Какая версия find поддерживает этот тип для -type? Человек находит списки b, c, d, p, f, l, s и D в моей системе.
innaM 15 лет назад
2
То же самое и в моей находке тоже нет `-type x`.
davr 15 лет назад
2
Почему-то я всегда думаю, что "-type x" тоже подойдет. Я могу только предположить, что это было доступно на некотором аромате Unix, который я использовал однажды.
Dave Webb 15 лет назад
0
@dave: рад слышать, что я не единственный :)
knittl 15 лет назад
0
Если у вас есть старая версия find (вероятно, до 4.3.8), в которой отсутствует -executable, используйте find. -perm / u = x, g = x, o = x.
Ludwig Weinzierl 14 лет назад
6
-исполняемый не переносимый и его следует избегать
Good Person 12 лет назад
2
`find: неверный предикат -executable'` на RHEL
SSH This 11 лет назад
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 15 лет назад
1
Затем вы должны попробовать версию "-perm +", которая в GNU find устарела: find. -пермь +111 "
innaM 15 лет назад
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 6 лет назад
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 8 лет назад
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 8 лет назад
0
Использование '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 7 лет назад
0