Unix,find命令和false negative


1

从此文件所在的当前目录执行搜索,此find命令查找该文件。

# find . page.tpl.php

但是,当我从子目录中搜索此命令时,

# find ../. page.tpl.php

打印出文件列表,输出中列出了所请求的文件,

.././parent_dir/page.tpl.php

但是,结果是,

find: `page.tpl.php': No such file or directory

然后,当我添加-name参数时,它工作,

# find ../. -name page.tpl.php

我有时会忘记使用参数,而假阴性真的是加重了。这是怎么回事?


这里没有假阴性。该程序完全按照您的要求完成,并返回正确的结果。一个更好的问题是“为什么find有这么有趣的命令行语法?” 或者“究竟在这做什么?”
dmckee 2011年

我认为我的问题是恰当的。如果你想问一个“更好的问题”,你当然可以自由地这样做。
xtian

后续尝试RedGrittyBrick的建议,我使用相对路径而不是../。在另一个文件“ts-unix-find”上,这次它起作用了。我以为我在帖子中弄错了。然后我注意到了点语法。果然,当我重命名文件“ts-unix-find.save”并执行上面的前两个find命令时,我重复了这个行为。显然,具有相对路径的find命令和包含点的“表达式”不起作用。现在我想要理解这种“表达”的区别......
^

Answers:


1

find [path] [expressions]

文件名不是表达式。

默认操作是打印。

对于路径,“..”优于“../”。你几乎不需要包括“。” 除非是在相对路径的开头。


好。我很感激您回答我帖子的方法。文件名不是表达式是一个迷失的区别,也就是说我知道你在区分,但我不明白它的含义。默认的打印操作非常好。实际上我想在使用-name时强制执行打印操作,但它仍保持静默。我尝试了......并且在评论后续行动中学到了一些东西...
xtian

0

命令find使用:
find [-H] [-L] [-P] [path ...] [expression]

你的第一个例子是:
find ../. page.tpl.php

你做了什么是找到两个搜索路径。由于默认表达式是print,因此两个路径的内容将打印到stdout。

考虑一下:

mkdir a b c 
touch  a/file1 a/file2 b/SANTACLAUS c/MONKEYS
find a b

$ find a b
a
a/file2
a/file1
b
b/SANTACLAUS

你的第二个例子是:
.././parent_dir/page.tpl.php

在这里,您提供了一条搜索路径 该错误告诉您在CWD中找不到page.tpl.php。我认为这是因为您没有'parent_dir'目录下的'page.tpl.php'文件。


不,文件在那里。我首先在同一目录中执行了find。然后进入子目录并使用相对路径执行相同的查找../。我从未移动过文件,它仍然在那里。
xtian 2011年
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.