简体   繁体   中英

Finding executable files using ls and grep

I have to write a script that finds all executable files in a directory. So I tried several ways to implement it and they actually work. But I wonder if there is a nicer way to do so.

So this was my first approach:

ls -Fla | grep \*$

This works fine, because the -F flag does the work for me and adds to each executable file an asterisk, but let's say I don't like the asterisk sign.

So this was the second approach:

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

This too works fine, I want a dash as first character, then I'm not interested in the next two characters and the fourth character must be a x.

But there's a bit of ambiguity in the requirements, because I don't know whether I have to check for user, group or other executable permission. So this would work:

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

So I'm testing the fourth, seventh and tenth character to be a x.

Now my real question, is there a better solution using ls and grep with regex to say:

I want to grep only those files, having at least one x in the ten first characters of a line produced by ls -la

Do you need to use ls? You can use find to do the same:

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

will return all executable files in the current directory. Remove the -maxdepth flag to traverse all child directories.

You could try this terribleness but it might match files that contain strings that look like permissions.

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

If you absolutely must use ls and grep, this works:

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

It matches lines where the first word (non-whitespace) contains at least one 'x'.

Find is the perfect tool for this. This finds all files (-type f) that are executable:

find . -type f -executable

If you don't want it to recursively list all executables, use maxdepth:

find . -maxdepth 1 -type f -executable

Perhaps with test -x?

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

The \\ on ls will bypass shell aliases.

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

这给出了可执行文件的绝对路径。

While the question is very old and has been answered a long time ago, I want to add the version for anyone who is using the fd utility (which I personally highly recommend, see https://github.com/sharkdp/fd if you want to try), you get the same result as find . -type f -executable find . -type f -executable by running:

fd -tx

or

fd --type executable

One can also add -d or --max-depth argument, same as for the original find .

Maybe someone will find this useful.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM