如何使用“locate”仅查找可执行文件?

如何使用“locate”仅查找可执行文件?

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迭代从管道 (from locate)接收到的每一行
  • 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接收的所有文件的名称。搜索所有这些文件以查找与以下表达式的匹配项,如果其中任何一个是目录,它也会检查它们的内容。locatefind
    • -prune:如果正在评估的文件名属于某个目录,则不要搜索其内容。
    • -type f:在输出中仅包含属于“常规”文件的文件名,而不是设备、命名管道等特殊文件名。
    • -executable:在输出中仅包含可执行文件的文件名。也就是说,无论文件内容如何,​​都设置了一个或多个可执行模式位。

简而言之,locate将匹配文件的名称打印到标准输出,该输出通过管道(使用|)传输到 的标准输入xargsxargs从标准输入读取文件名并将它们组合成单个字符串中的空格分隔列表。如果字符串不为空,则在执行命令之前替换命令中xargs的字符串。{}find

答案3

简短的回答,使用 GNU find:

find / -type f -executable -name '*gtags*'

相关内容