Подтвердить что ты не робот

Поиск исполняемых файлов с использованием ls и grep

Мне нужно написать script, который находит все исполняемые файлы в каталоге. Поэтому я попробовал несколько способов реализовать его, и они действительно работают. Но мне интересно, есть ли более хороший способ сделать это.

Итак, это был мой первый подход:

ls -Fla | grep \*$

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

Итак, это был второй подход:

ls -la | grep -E ^-.{2}x 

Это тоже отлично работает, я хочу тире как первый символ, тогда меня не интересуют следующие два символа, а четвертый символ должен быть х.

Но есть немного двусмысленности в требованиях, потому что я не знаю, нужно ли мне проверять пользовательское, групповое или другое исполняемое разрешение. Таким образом, это сработает:

ls -la | grep -E ^-.{2}x\|^-.{5}x\|^-.{8}x

Итак, я тестирую четвертый, седьмой и десятый персонажи как х.

Теперь мой реальный вопрос, есть ли лучшее решение, использующее ls и grep с регулярным выражением, чтобы сказать:

Я хочу grep только те файлы, имеющие хотя бы один x из десяти первых символов строки, созданной ls -la

4b9b3361

Ответ 1

Вам нужно использовать ls? Вы можете использовать find, чтобы сделать то же самое:

find . -maxdepth 1 -perm -111 -type f

вернет все исполняемые файлы в текущем каталоге. Удалите флаг -maxdepth для перемещения всех дочерних каталогов.

Вы можете попробовать эту ужасность, но она может соответствовать файлам, которые содержат строки, похожие на разрешения.

ls -lsa | grep -E "[d\-](([rw\-]{2})x){1,3}"

Ответ 2

Если вы абсолютно должны использовать ls и grep, это работает:

ls -Fla | grep '^\S*x\S*'

Он соответствует строкам, где первое слово (не-пробелы) содержит по крайней мере одно "x".

Найти - идеальный инструмент для этого. Это находит все исполняемые файлы (-type f):

find . -type f -executable

Если вы не хотите, чтобы он рекурсивно перечислил все исполняемые файлы, используйте maxdepth:

find . -maxdepth 1 -type f -executable

Ответ 3

Возможно, с тестом -x?

for f in $(\ls) ; do test -x $f && echo $f ; done

\ on ls будет обходить псевдонимы оболочки.

Ответ 4

for i in `ls -l | awk '{ if ( $1 ~ /x/ ) {print $NF}}'`; do echo `pwd`/$i; done

Это дает абсолютные пути к исполняемым файлам.

Ответ 5

file * |grep "ELF 32-bit LSB executable"|awk '{print $1}'