Поиск исполняемых файлов с использованием LS и GREP
Вопрос
Я должен написать сценарий, который находит все исполняемые файлы в каталоге. Поэтому я попробовал несколько способов его реализации, и они на самом деле работают. Но мне интересно, есть ли более приятный способ сделать это.
Так что это был мой первый подход:
ls -Fla | grep \*$
Это работает нормально, потому что флаг -F делает работу для меня и добавляет в каждый исполняемый файл звездочку, но, допустим, мне не нравится знак звездочки.
Так что это был второй подход:
ls -la | grep -E ^-.{2}x
Это тоже работает нормально, я хочу, чтобы в качестве первого персонажа я хочу чертовски, тогда меня не интересует следующих двух символов, и четвертый персонаж должен быть X.
Но в требованиях есть небольшая двусмысленность, потому что я не знаю, должен ли мне проверить наличие пользователей, группы или другого исполняемого разрешения. Так что это сработало:
ls -la | grep -E ^-.{2}x\|^-.{5}x\|^-.{8}x
Так что я проверяю четвертого, седьмого и десятого персонажа как х.
Теперь мой реальный вопрос, есть ли лучшее решение с использованием LS и Grep с Regex, чтобы сказать:
Я хочу герметизировать только эти файлы, имея хотя бы один x в десяти первых символах линии, созданной ls -la
Решение
Вам нужно использовать LS? Вы можете использовать поиск, чтобы сделать то же самое:
find . -maxdepth 1 -perm -111 -type f
Вернут все исполняемые файлы в текущем каталоге. Удалите флаг -maxDepth, чтобы пройти все детские каталоги.
Вы можете попробовать эту ужасность, но она может соответствовать файлам, которые содержат строки, которые выглядят как разрешения.
ls -lsa | grep -E "[d\-](([rw\-]{2})x){1,3}"
Другие советы
Если вам абсолютно необходимо использовать LS и Grep, это работает:
ls -Fla | grep '^\S*x\S*'
Он соответствует строкам, в которых первое слово (не-белое пространство) содержит хотя бы один «x».
Найти идеальный инструмент для этого. Это находит все файлы (-type f), которые являются исполняемыми:
find . -type f -executable
Если вы не хотите, чтобы он повторно перечислил все исполняемые файлы, используйте MaxDepth:
find . -maxdepth 1 -type f -executable
Возможно с тестом -x?
for f in $(\ls) ; do test -x $f && echo $f ; done
On LS будет обойти псевдонимов оболочки.
for i in `ls -l | awk '{ if ( $1 ~ /x/ ) {print $NF}}'`; do echo `pwd`/$i; done
Это дает абсолютные пути исполняемым файлам.
file * |grep "ELF 32-bit LSB executable"|awk '{print $1}'