Поиск исполняемых файлов с использованием 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
Ответы
Ответ 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}'