Поиск исполняемых файлов с использованием ls и grep - PullRequest
27 голосов
/ 18 октября 2011

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

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

ls -Fla | grep \*$

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

Так что это был второй подход:

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

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

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

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

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

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

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

Ответы [ 5 ]

47 голосов
/ 18 октября 2011

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

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

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

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

ls -lsa | grep -E "[d\-](([rw\-]{2})x){1,3}"
39 голосов
/ 18 октября 2011

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

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

Соответствует строкам, в которых первое слово (без пробела) содержит хотя бы один 'x'.

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

find . -type f -executable

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

find . -maxdepth 1 -type f -executable
7 голосов
/ 18 октября 2011

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

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

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

5 голосов
/ 14 ноября 2012
for i in `ls -l | awk '{ if ( $1 ~ /x/ ) {print $NF}}'`; do echo `pwd`/$i; done

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

0 голосов
/ 30 августа 2016
file * |grep "ELF 32-bit LSB executable"|awk '{print $1}'
...