我必须编写一个脚本,该脚本在目录中找到所有可执行文件。因此,我尝试了几种实施方法,它们实际上可以工作。但是我想知道是否有更好的方法。

所以这是我的第一个方法:

ls -Fla | grep \*$

这可以正常工作,因为-f标志为我完成了工作,并将每个可执行文件添加到一个星号上,但假设我不喜欢星号符号。

因此,这是第二种方法:

ls -la | grep -E ^-.{2}x 

这也可以正常工作,我想要一个仪表板作为第一个字符,那么我对接下来的两个字符不感兴趣,第四个字符必须是x。

但是,需求有些歧义,因为我不知道我是否必须检查用户,组还是其他可执行的许可。因此,这将有效:

ls -la | grep -E ^-.{2}x\|^-.{5}x\|^-.{8}x

因此,我正在测试第四个,第七和第十个字符,为X。

现在我真正的问题是,使用LS和GREP带有Regex可以说:有一个更好的解决方案:

我只想抓取这些文件,在生产的一条行的十个第一个字符中至少有一个x ls -la

有帮助吗?

解决方案

您需要使用LS吗?您可以使用查找同样的事情:

find . -maxdepth 1 -perm -111 -type f

将返回当前目录中的所有可执行文件。删除-maxDepth标志以遍历所有儿童目录。

您可以尝试这种恐怖性,但它可能匹配包含看起来像权限的字符串的文件。

ls -lsa | grep -E "[d\-](([rw\-]{2})x){1,3}"

其他提示

如果您绝对必须使用LS和GREP,这有效:

ls -Fla | grep '^\S*x\S*'

它匹配第一个单词(非Whitespace)至少包含一个“ x”的行。

找到是理想的工具。这找到了可执行文件的所有文件(-Type F):

find . -type f -executable

如果您不希望它递归列出所有可执行文件,请使用MaxDepth:

find . -maxdepth 1 -type f -executable

也许使用测试-X?

for f in $(\ls) ; do test -x $f && echo $f ; done

on LS将绕过外壳别名。

for i in `ls -l | awk '{ if ( $1 ~ /x/ ) {print $NF}}'`; do echo `pwd`/$i; done

这为可执行文件提供了绝对的路径。

file * |grep "ELF 32-bit LSB executable"|awk '{print $1}'
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top