Finding executable files using ls and grep
Solution 1
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}"
Solution 2
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
Solution 3
Perhaps with test -x?
for f in $(\ls) ; do test -x $f && echo $f ; done
The \ on ls will bypass shell aliases.
Solution 4
for i in `ls -l | awk '{ if ( $1 ~ /x/ ) {print $NF}}'`; do echo `pwd`/$i; done
This gives absolute paths to the executables.
Solution 5
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
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.
k13n
Updated on August 02, 2020Comments
-
k13n almost 4 years
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
-
k13n over 12 yearsThan you for your answer and
find . -type f -executable
works perfectly. But as I said before I have to use ls and grep. I'm just wondering if there is a solution for a smarter regex -
Spencer Rathbun over 12 yearsAny particular reason? looping through ls output is a bad idea.
-
Lynn over 12 yearsOkay, I added a regex that will do what you want.
-
Alexander Pozdneev over 8 yearsTo cut the starting "./" use
find . -maxdepth 1 -type f -executable | cut -c 3-
-
Simon F about 8 yearsAFAICS that also lists directories. The OP might be better with...
for f in $(\ls) ; do /usr/bin/test -x $f -a ! -d $f && echo $f ; done
-
lmo over 7 yearsThis answer turned up in the low quality review queue, presumably because you don't provide any explanation of the code. If this code answers the question, consider adding adding some text explaining the code in your answer. This way, you are far more likely to get more upvotes — and help the questioner learn something new.
-
Yan Foto over 6 yearsNOTE:
-executable
flag is not available under macOS. See here for alternatives. (for those who came here through some search engine!)