是否有具有find
更常规的CLI界面的替代程序?find
与大多数其他实用程序完全不同的方式工作并期望参数。
澄清:我正在寻找一个程序,该程序具有与命令行界面中find几乎相同的功能,该命令行界面的工作原理和感觉类似于POSIX(或至少是GNU)命令行建议。
ack
并且想知道是否还有更好的find
方法。
是否有具有find
更常规的CLI界面的替代程序?find
与大多数其他实用程序完全不同的方式工作并期望参数。
澄清:我正在寻找一个程序,该程序具有与命令行界面中find几乎相同的功能,该命令行界面的工作原理和感觉类似于POSIX(或至少是GNU)命令行建议。
ack
并且想知道是否还有更好的find
方法。
Answers:
这是一个普遍的误解。
查找遵循选项语法。您只是将表达式原语与选项混淆:
find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
[cmd][--> options <--] [--> arg0..argN <--]
替代方法是定位。但是find实现了自己的表达式语法,因为它提供了更丰富的过滤器和操作选项集。没有其他选择可以做到这一点,仅仅是因为它是多余的。
find
“期望参数的方式与大多数其他utils完全不同”。您声明OP是“使表达式主图与选项混淆”。其他大多数utils甚至有“表达式原语”的概念吗?如果不是,那不表明 OP的意义吗?那真的不是使用的最奇怪的部分find
。其他CLI涉及什么{}
(当然必须以某种方式进行转义)?
这取决于find
您所依赖的精确功能。如果它(主要是)发现功能,则某些外壳程序支持递归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
通过glob限定符, Zsh具有更多类似find的可能性(看起来接近man zshexpn
)。例如:
ls -l **/*(.)
≈ find -type f -ls
ls *(m-2u:$USER:)
≈ find -mtime -2 -user $USER
Bash 4也有**/
(您需要使用启用它shopt -s globstar
),但是没有什么像glob限定符一样。
我来看看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 odg e。但是如果你给它.odg
,则不会。
但是有一个缺点:它需要一个数据库。发生变化时需要更新此数据库。不过,我的Fedora 13安装程序已将其放入每日crontab中。
locate
您想找到什么?如果您通常要搜索源代码文件,请查看ack
。它基本上是一个源代码搜索工具,但是ack的-f
开关将查找与给定文件类型匹配的文件。
因此,如果要查找目录中的所有Perl文件,例如:
ack -f --perl
如果您不喜欢ack可以识别的文件类型,则可以在中添加自己的文件类型~/.ackrc
。
ack不是像一样的通用文件查找器find
,但是如果您使用的是源代码,它会非常方便。
每个程序员都应该学习的很棒的事情之一是:如果找不到工具,那就建立自己的工具!
#!/usr/bin/bash
find -name $<
我可能会写一个更好的-t
过滤器类型等。
编辑:上面是一个Bash脚本。它使用命令行参数并将其传递以查找-name选项的值。只是一个简单的例子。自从我提出了这个答案以来,我发现了这个python脚本:
https://github.com/sjl/friendly-find/
界面看起来不错,但我尚未测试其性能。可能值得检查。
$<
在我的Bash中没有做任何有用的事情。您期望它做什么?你是说"$@"
真的吗 或者"$1"
(这基本上是Makefile中的意思)?
$<
是csh
等效read
-我猜他的意思是。
在Unix中查找事物的最标准方法。
du -a <directory>|grep <pattern>| awk '{print $2}'
awk
,但是UNIX哲学的一大优点是,无需了解更复杂的工具(例如awk
和find
)的所有功能,就可以构造可以执行所需功能的管道。任务。grep | awk
可能不是最佳选择(或者,在具有高度优化的高性能多线程系统上grep
,也许会是最佳选择!),但这很简单。