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

Jic*_*hao 8 locate

locate gtags会找到所有名为gtags.

如果我只需要可执行文件怎么办,有什么办法可以做到这一点?

noh*_*ide 7

不容易。您可以使用

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部件会将其打印在您的屏幕上


Mr.*_*oan 5

最快和最便宜的解决方案:

locate -b '\gtags' | xargs -ri find {} -prune -type f -executable
Run Code Online (Sandbox Code Playgroud)

根据xargs手册页,上述语法将找到的所有文件名传递locate给 的单次执行find,该执行仅检查指定的文件。

此解决方案比之前给出的解决方案更好,因为:

  • 使用find从根目录开始搜索系统上的每个文件可能是一个简短的命令,但它可能需要很长时间才能运行。
  • 使用 shell 的 while 循环检查每个文件名可能会很慢,因为它一次检查一个文件。

由于其他人要求对早期答案中给出的参数进行详细解释,因此详细信息是:

  • locate(请参阅:调用定位 - 查找文件
    • -b: 仅将路径名的基本文件名与指定模式匹配,不考虑路径名中目录的名称。
    • \: 由于反斜杠是一个通配符,它​​可以防止locate将模式gtags, 视为*gtags*。即,它查找具有确切名称“gtags”且前后没有其他字符的文件。
  • xargs(请参阅:xargs 选项 - 查找文件
    • -r: 如果标准输入完全为空,则不要运行该命令。
    • -i{}用从标准输入读取的文件名列表替换以下命令。
  • find(请参阅:查找主索引 - 查找文件
    • {}:xargs用它从locate标准输入接收的所有文件的名称替换它。 find搜索所有这些文件以查找与以下表达式的匹配项,如果其中任何一个是目录,它也会检查它们的内容。
    • -prune:如果正在评估的文件名属于某个目录,则不要搜索其内容。
    • -type f: 在输出中只包含属于“常规”文件的文件名,而不是像设备、命名管道等特殊文件名。
    • -executable: 在输出中只包含可执行文件的文件名。也就是说,无论文件内容如何,​​都设置了一个或多个可执行模式位。

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