(我在find
这里假设GNU )
仅使用
find filename
这样会很快,因为它只会返回filename
,filename
如果是目录则返回内部名称,如果当前目录中不存在该名称,则会返回错误。这是一个非常快速的操作,类似于ls filename
(但如果filename
是目录则是递归的)。
相反,
find | grep filename
将允许从当前目录及以下目录find
生成所有名称的列表,grep
然后对其进行过滤。这显然是一个慢得多的操作。
我假设实际打算的是
find . -type f -name 'filename'
该filename
名称将作为当前目录中或以下任何位置的常规文件的名称。
这将与一样快(或相对快)find | grep filename
,但是grep
解决方案将与filename
每个找到的名称的完整路径匹配,类似于的-path '*filename*'
处理find
。
困惑来自对find
工作方式的误解。
该实用程序采用许多路径,并返回这些路径下的所有名称。
然后,您可以使用各种测试来限制返回的名称,这些测试可能会影响文件名,路径,时间戳,文件大小,文件类型等。
当你说
find a b c
您要求find
列出三个路径下可用的每个名称a
,b
并且c
。如果这些恰好是当前目录中常规文件的名称,则将返回这些文件。如果其中任何一个碰巧是目录名,则它将与该目录中的所有其他名称一起返回。
当我做
find . -type f -name 'filename'
这将生成当前目录(.
)及以下目录中所有名称的列表。然后,将名称限制为常规文件的名称,即不是目录等-type f
。然后有一个进一步的限制,以该名称匹配filename
使用-name 'filename'
。该字符串filename
可能是文件名遍历模式,例如*.txt
(请记住要引用它!)。
例:
以下内容似乎可以“查找” .profile
我的主目录中调用的文件:
$ pwd
/home/kk
$ find .profile
.profile
但实际上,它只是返回路径中的所有名称.profile
(只有一个名称,而该名称就是该文件的名称)。
然后,我cd
升一级,然后重试:
$ cd ..
$ pwd
/home
$ find .profile
find: .profile: No such file or directory
find
现在,该命令找不到名为的任何路径.profile
。
但是,如果我让它查看当前目录,然后将返回的名称限制为only.profile
,它也会从那里找到它:
$ pwd
/home
$ find . -name '.profile'
./kk/.profile