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