不容易。您可以使用
locate bash | while IFS= read -r line; do [[ -x "$line" ]] && echo $line; done
Run Code Online (Sandbox Code Playgroud)
查找名称包含的所有可执行文件bash
。这比find
在整个文件系统中使用要快,因为只需要检查几个文件。
locate bash
做它一直做的事情(列出所有匹配项)|
(pipe) 从第一个命令 ( ) 获取输出locate
并将其发送到第二个命令(行的其余部分)while ...; do ... done
循环迭代每次从管接收线(从locate
)read -r line
读取一行输入并将其存储在一个名为的变量中line
(在我们的例子中,是一个路径/文件名)[[ -x "$line" ]]
测试输入的文件$line
是否可执行&& echo $line
部件会将其打印在您的屏幕上最快和最便宜的解决方案:
locate -b '\gtags' | xargs -ri find {} -prune -type f -executable
Run Code Online (Sandbox Code Playgroud)
根据xargs
手册页,上述语法将找到的所有文件名传递locate
给 的单次执行find
,该执行仅检查指定的文件。
此解决方案比之前给出的解决方案更好,因为:
find
从根目录开始搜索系统上的每个文件可能是一个简短的命令,但它可能需要很长时间才能运行。由于其他人要求对早期答案中给出的参数进行详细解释,因此详细信息是:
locate
(请参阅:调用定位 - 查找文件)
-b
: 仅将路径名的基本文件名与指定模式匹配,不考虑路径名中目录的名称。\
: 由于反斜杠是一个通配符,它可以防止locate
将模式gtags
, 视为*gtags*
。即,它查找具有确切名称“gtags”且前后没有其他字符的文件。xargs
(请参阅:xargs 选项 - 查找文件)
-r
: 如果标准输入完全为空,则不要运行该命令。-i
:{}
用从标准输入读取的文件名列表替换以下命令。find
(请参阅:查找主索引 - 查找文件)
{}
:xargs
用它从locate
标准输入接收的所有文件的名称替换它。 find
搜索所有这些文件以查找与以下表达式的匹配项,如果其中任何一个是目录,它也会检查它们的内容。-prune
:如果正在评估的文件名属于某个目录,则不要搜索其内容。-type f
: 在输出中只包含属于“常规”文件的文件名,而不是像设备、命名管道等特殊文件名。-executable
: 在输出中只包含可执行文件的文件名。也就是说,无论文件内容如何,都设置了一个或多个可执行模式位。简而言之,locate
将匹配文件的名称打印到标准输出,然后通过管道(使用|
)进入xargs
. xargs
从标准输入读取文件名,并将它们组合成一个空格分隔的列表在一个字符串中。如果字符串不为空,则在执行命令之前xargs
替换命令中的字符串。{}
find