How can I find only the executable files under a certain directory in Linux?
Solution 1:
Checking for executable files can be done with -perm
(not recommended) or -executable
(recommended, as it takes ACL into account). To use the -executable
option:
find <dir> -executable
if you want to find only executable files and not searchable directories, combine with -type f
:
find <dir> -executable -type f
Solution 2:
Use the find's -perm
option. This will find files in the current directory that are either executable by their owner, by group members or by others:
find . -perm /u=x,g=x,o=x
Edit:
I just found another option that is present at least in GNU find 4.4.0:
find . -executable
This should work even better because ACLs are also considered.
Solution 3:
I know the question specifically mentions Linux, but since it's the first result on Google, I just wanted to add the answer I was looking for (for example if you are - like me at the moment - forced by your employer to use a non GNU/Linux system).
Tested on macOS 10.12.5
find . -perm +111 -type f
Solution 4:
I have another approach, in case what you really want is just to do something with executable files--and not necessarily to actually force find to filter itself:
for i in `find -type f`; do [ -x $i ] && echo "$i is executable"; done
I prefer this because it doesn't rely on -executable
which is platform specific; and it doesn't rely on -perm
which is a bit arcane, a bit platform specific, and as written above requires the file to be executable for everyone (not just you).
The -type f
is important because in *nix directories have to be executable to be traversable, and the more of the query is in the find
command, the more memory efficient your command will be.
Anyhow, just offering another approach, since *nix is the land of a billion approaches.
Solution 5:
A file marked executable need not be a executable or loadable file or object.
Here is what I use:
find ./ -type f -name "*" -not -name "*.o" -exec sh -c '
case "$(head -n 1 "$1")" in
?ELF*) exit 0;;
MZ*) exit 0;;
#!*/ocamlrun*)exit0;;
esac
exit 1
' sh {} \; -print