k13*_*13n 29 linux bash grep ls
我必须编写一个脚本来查找目录中的所有可执行文件.所以我尝试了几种方法来实现它,它们确实有效.但我想知道是否有更好的方法可以做到这一点.
所以这是我的第一个方法:
ls -Fla | grep \*$
Run Code Online (Sandbox Code Playgroud)
这很好用,因为-F标志为我工作并为每个可执行文件添加一个星号,但是假设我不喜欢星号.
所以这是第二种方法:
ls -la | grep -E ^-.{2}x
Run Code Online (Sandbox Code Playgroud)
这也很好,我想要一个破折号作为第一个字符,然后我对接下来的两个字符不感兴趣,第四个字符必须是x.
但是要求中存在一些含糊之处,因为我不知道是否必须检查用户,组或其他可执行权限.这样可行:
ls -la | grep -E ^-.{2}x\|^-.{5}x\|^-.{8}x
Run Code Online (Sandbox Code Playgroud)
所以我测试第四,第七和第十个字符是x.
现在我真正的问题是,有一个更好的解决方案使用ls和grep与正则表达式说:
我想只grep那些文件,在一行的十个第一个字符中至少有一个x ls -la
小智 49
你需要使用ls吗?您可以使用find来执行相同的操作:
find . -maxdepth 1 -perm -111 -type f
Run Code Online (Sandbox Code Playgroud)
将返回当前目录中的所有可执行文件.删除-maxdepth标志以遍历所有子目录.
您可以尝试这种可怕但它可能匹配包含看起来像权限的字符串的文件.
ls -lsa | grep -E "[d\-](([rw\-]{2})x){1,3}"
Run Code Online (Sandbox Code Playgroud)
rmm*_*mmh 41
如果你绝对必须使用ls和grep,这有效:
ls -Fla | grep '^\S*x\S*'
Run Code Online (Sandbox Code Playgroud)
它匹配第一个单词(非空白)包含至少一个"x"的行.
Find是完美的工具.这将找到可执行的所有文件(-type f):
find . -type f -executable
Run Code Online (Sandbox Code Playgroud)
如果您不希望它以递归方式列出所有可执行文件,请使用maxdepth:
find . -maxdepth 1 -type f -executable
Run Code Online (Sandbox Code Playgroud)
也许用test -x?
for f in $(\ls) ; do test -x $f && echo $f ; done
Run Code Online (Sandbox Code Playgroud)
ls上的\将绕过shell别名.
小智 5
for i in `ls -l | awk '{ if ( $1 ~ /x/ ) {print $NF}}'`; do echo `pwd`/$i; done
Run Code Online (Sandbox Code Playgroud)
这给出了可执行文件的绝对路径.