2009-09-10 11:56:56 +0000 2009-09-10 11:56:56 +0000
170
170

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

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

Ответы (7)

170
170
170
2009-09-10 11:59:26 +0000

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

find <dir> -executable

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

find <dir> -executable -type f
```.
35
35
35
2009-09-10 15:55:13 +0000

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

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

Edit:

Я только что нашел еще одну опцию, которая присутствует, по крайней мере, в GNU find 4.4.0:

find . -executable

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

16
16
16
2017-06-01 06:59:33 +0000

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

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

find . -perm +111 -type f
3
3
3
2016-04-24 02:38:26 +0000

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

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

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

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

Как бы то ни было, просто предлагаем другой подход, так как *nix - это страна миллиардных подходов.

2
2
2
2014-03-26 07:52:24 +0000

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

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

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
1
1
2017-07-09 12:31:14 +0000

Как поклонник одного вкладыша…

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

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

Мне нужно было, чтобы найти файлы с оценкой в скриптах, принадлежащих 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 &
```, создайте следующую команду
0
0
0
2019-06-06 00:08:27 +0000

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

# Quickly locate executables not in the path
xlocate () {
    locate -0r "$1" | xargs -0 -I{} bash -c '[[-x "$1"]] && [[! -d "$1"]] \
        && echo "executable: $1"' _ {}
} # xlocate ()

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

Например:

$ time xlocate llocate
executable: /bin/ntfsfallocate
executable: /home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/bin/ntfsfallocate
executable: /mnt/clone/home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/usr/bin/fallocate
executable: /mnt/e/bin/llocate
executable: /mnt/old/bin/ntfsfallocate
executable: /mnt/old/usr/bin/fallocate
executable: /usr/bin/fallocate

real 0m0.504s
user 0m0.487s
sys 0m0.018s

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

$ time xlocate /mnt/e/usr/local/bin/ | wc -l
65

real 0m0.741s
user 0m0.705s
sys 0m0.032s

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

6
10
11
7
4