我必须编写一个脚本来查找目录中的所有可执行文件。所以我尝试了几种方法来实现它,它们确实有效。但我想知道是否有更好的方法可以这样做。
所以这是我的第一个方法:
ls -Fla | grep \*$
这样可以正常工作,因为-F标志为我工作并为每个可执行文件添加一个星号,但是假设我不喜欢星号。
所以这是第二种方法:
ls -la | grep -E ^-.{2}x
这也很好用,我想要一个短划线作为第一个字符,然后我对接下来的两个字符不感兴趣,第四个字符必须是x。
但是要求中存在一些含糊之处,因为我不知道是否必须检查用户,组或其他可执行权限。所以这会奏效:
ls -la | grep -E ^-.{2}x\|^-.{5}x\|^-.{8}x
所以我测试第四,第七和第十个字符是x。
现在我真正的问题是,有一个更好的解决方案使用ls和grep与正则表达式说:
我只想grep那些文件,在ls -la
生成的一行的十个第一个字符中至少有一个x
答案 0 :(得分:46)
你需要使用ls吗?你可以使用find来做同样的事情:
find . -maxdepth 1 -perm -111 -type f
将返回当前目录中的所有可执行文件。删除-maxdepth标志以遍历所有子目录。
您可以尝试这种可怕但它可能匹配包含看起来像权限的字符串的文件。
ls -lsa | grep -E "[d\-](([rw\-]{2})x){1,3}"
答案 1 :(得分:39)
如果你绝对必须使用ls和grep,这可行:
ls -Fla | grep '^\S*x\S*'
它匹配第一个单词(非空白)包含至少一个'x'的行。
Find是完美的工具。这将找到所有可执行文件(-type f):
find . -type f -executable
如果您不希望它以递归方式列出所有可执行文件,请使用maxdepth:
find . -maxdepth 1 -type f -executable
答案 2 :(得分:7)
也许用test -x?
for f in $(\ls) ; do test -x $f && echo $f ; done
ls上的\将绕过shell别名。
答案 3 :(得分:5)
for i in `ls -l | awk '{ if ( $1 ~ /x/ ) {print $NF}}'`; do echo `pwd`/$i; done
这给出了可执行文件的绝对路径。
答案 4 :(得分:0)
虽然这个问题很老并且很久以前就已经回答了,但我想为使用fd
实用程序的任何人添加该版本(我个人强烈推荐,如果没有,请参见https://github.com/sharkdp/fd您可以尝试运行),则通过运行以下命令可获得与find . -type f -executable
相同的结果:
fd -tx
或
fd --type executable
还可以添加-d
或--max-depth
参数,与原始find
相同。
也许有人会觉得有用。
答案 5 :(得分:-3)
file * |grep "ELF 32-bit LSB executable"|awk '{print $1}'