Finding executable files using ls and grep

65,180

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.

Share:
65,180
k13n
Author by

k13n

Updated on August 02, 2020

Comments

  • k13n
    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
    k13n over 12 years
    Than 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
    Spencer Rathbun over 12 years
    Any particular reason? looping through ls output is a bad idea.
  • Lynn
    Lynn over 12 years
    Okay, I added a regex that will do what you want.
  • Alexander Pozdneev
    Alexander Pozdneev over 8 years
    To cut the starting "./" use find . -maxdepth 1 -type f -executable | cut -c 3-
  • Simon F
    Simon F about 8 years
    AFAICS 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
    lmo over 7 years
    This 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
    Yan Foto over 6 years
    NOTE: -executable flag is not available under macOS. See here for alternatives. (for those who came here through some search engine!)