替代找到?[关闭]


30

是否有具有find更常规的CLI界面的替代程序?find与大多数其他实用程序完全不同的方式工作并期望参数。

澄清:我正在寻找一个程序,该程序具有与命令行界面中find几乎相同的功能,该命令行界面的工作原理和感觉类似于POSIX(或至少是GNU)命令行建议。


7
GNU find不遵守POSIX(甚至GNU)命令行准则。例如,参数的排序,带有单破折号的多字符选项等与一致程序中的不同。
塔玛斯·塞莱伊(TamásSzelei)2011年

3
我知道,而且我总是可以以一种或另一种方式做我想做的事情。我最近才知道,ack并且想知道是否还有更好的find方法。
塔玛斯·塞莱伊(TamásSzelei)2011年

2
不,您知道,我不需要一种小型编程语言,而是一种更简单,更直观,更一致的发现(即使那意味着失去了某些高级功能)。当我面对一项证明编写程序合理的任务时,我就会这样做。
塔玛斯·塞莱伊(TamásSzelei)2011年

2
找到既一致(见我的答案)又直观。并不是说初选的名字很奇怪。-exec表示执行,-print表示打印它,-name表示匹配名称。实际上,前3种和-型覆盖了95%的使用情况。对于其他所有情况,都有人发现。
梅尔(Mel)

3
我在一小时前编辑过的@tamas告诉你,除了locate别无选择。也许ls -R想到了。其他替代方案是模仿find的GUI程序。否则,您必须指定要查找替代项的操作。走目录树?过滤文件名?告诉您哪些文件较新?
梅尔(Mel)

Answers:


11

这是一个普遍的误解。

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

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

替代方法是定位。但是find实现了自己的表达式语法,因为它提供了更丰富的过滤器和操作选项集。没有其他选择可以做到这一点,仅仅是因为它是多余的。


5
即使是我的错,也无法回答我的问题。
塔玛斯·塞莱伊(TamásSzelei)2011年

表达式(仅允许一个?),cmd(dito?),选项和参数之间有什么区别?
用户未知,

@user未知-find命令实现其自己的表达式语法。给出表达式后,该表达式是命令行上的最后一个参数。如果不存在,则表达式解析为-print。
梅尔(Mel)

嗯-现在我知道[cmd]不在[expression]后面,但这是前面的描述。
用户未知

2
OP断言find“期望参数的方式与大多数其他utils完全不同”。您声明OP是“使表达式主图与选项混淆”。其他大多数utils甚至有“表达式原语”的概念吗?如果不是,那不表明 OP的意义吗?那真的不是使用的最奇怪的部分find。其他CLI涉及什么{}(当然必须以某种方式进行转义)?
Kyle Strand

10

这取决于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限定符一样。


10

我来看看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
安德鲁·兰伯特

1
而且,locate也接受模式(我最近才学到这一点)。
亚当·伯特

5

您想找到什么?如果您通常要搜索源代码文件,请查看ack。它基本上是一个源代码搜索工具,但是ack的-f开关将查找与给定文件类型匹配的文件。

因此,如果要查找目录中的所有Perl文件,例如:

ack -f --perl

如果您不喜欢ack可以识别的文件类型,则可以在中添加自己的文件类型~/.ackrc

ack不是像一样的通用文件查找器find,但是如果您使用的是源代码,它会非常方便。


1
这不是用户的要求,但人们可能会发现找到的源代码(如grep)非常有用银搜索器silversearcher-ag包装上的主要发行版。
巴勃罗

-1

每个程序员都应该学习的很棒的事情之一是:如果找不到工具,那就建立自己的工具!

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

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

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

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

界面看起来不错,但我尚未测试其性能。可能值得检查。


1
适用于构建自己的工具声明。但是至少要说明一下您的小脚本应该如何工作。
jippie 2012年

1
$<在我的Bash中没有做任何有用的事情。您期望它做什么?你是说"$@"真的吗 或者"$1"(这基本上是Makefile中的意思)?
tripleee

1
@tripleee - $<csh等效read-我猜他的意思是。
DarkHeart's

-2

在Unix中查找事物的最标准方法。

du -a <directory>|grep <pattern>| awk  '{print $2}'

1
grep | awk是反模式。请参阅的无用用法grep。如果您想对模式进行参数化,也许du -a | awk -v "pat=<pattern>" '$0 ~ pat { print $2 }'
三点

@tripleee这是有关的非常有用的信息awk,但是UNIX哲学的一大优点是,无需了解更复杂的工具(例如awkfind)的所有功能,就可以构造可以执行所需功能的管道。任务。grep | awk可能不是最佳选择(或者,在具有高度优化的高性能多线程系统上grep,也许会是最佳选择!),但这很简单
Kyle Strand
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.