寻找替代方案?

寻找替代方案?

是否有find具有更传统 CLI 界面的替代程序?find其工作方式和期望参数的方式与大多数其他实用程序截然不同。

澄清:我正在寻找一个与 find 功能基本相同的程序,其命令行界面的工作方式和感觉类似于 POSIX(或至少 GNU)命令行建议。

答案1

我会看一下locate。它将查看其文件数据库并快速打印出与您提供的内容相匹配的路径名。

kevin@box:~$ locate odg
/home/kevin/Documents/final.odg
/usr/share/doc/packages/sysconfig/netconfig.odg
/usr/share/gimp/2.0/help/en/gimp-tool-dodge-burn.html
....
kevin@box:~$ locate .odg
/home/kevin/Documents/final.odg
/usr/share/doc/packages/sysconfig/netconfig.odg
kevin@box:~$ 

正如你所看到的,它是一个子文本匹配:如果你给它odg,那么它将匹配 d奥德格e.但如果你给了.odg,那就不会了。

但有一个缺点:它需要一个数据库。当情况发生变化时,需要更新该数据库。不过,我的 Fedora 13 安装已将其放入每日 crontab 中。

答案2

这是一个普遍的误解。

查找遵循选项语法。您只是将表达式原色与选项混淆了:

 find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
 [cmd][-->        options          <--] [--> arg0..argN  <--]

另一种选择是定位。但 find 实现了自己的表达式语法,因为它提供了更丰富的过滤器和操作选项集。没有其他选择可以做到同样的事情,因为它是多余的。

答案3

这取决于find您所依赖的精确功能。如果它(主要)是查找功能,则某些 shell 支持递归 glob。例如,与zsh

% find . -name \*c
./a/b/foo.c
./a/bar.c
./baz.c
inoshiro% ls *.c
baz.c
% ls **/*.c 
a/bar.c  a/b/foo.c  baz.c

Zsh 有更多类似查找的可能性全局限定符(查看 的末尾man zshexpn)。例如:

ls -l **/*(.)  ≈   find -type f -ls
ls *(m-2u:$USER:)  ≈  find -mtime -2 -user $USER

Bash 4 也有**/(您需要使用 启用它shopt -s globstar),但没有像 glob 限定符那样的。

答案4

每个程序员都应该学习的一件伟大的事情是:如果你找不到工具,那就构建自己的工具!

#!/usr/bin/bash
find -name $<

我可能会写一个更好的,带有-t过滤类型等。

编辑:上面是一个 Bash 脚本。它接受命令行参数并将其传递给 find 作为 -name 选项的值。只是一个简单的例子。自从我提出这个答案以来,我发现了这个 python 脚本:

https://github.com/sjl/friend-find/

界面看起来不错,但我还没有测试它的性能。可能值得一看。

相关内容