![如果没有给出路径,为什么 find 会打印前导“./”?](https://linux22.com/image/91882/%E5%A6%82%E6%9E%9C%E6%B2%A1%E6%9C%89%E7%BB%99%E5%87%BA%E8%B7%AF%E5%BE%84%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%20find%20%E4%BC%9A%E6%89%93%E5%8D%B0%E5%89%8D%E5%AF%BC%E2%80%9C.%2F%E2%80%9D%EF%BC%9F.png)
如果没有给出路径,为什么会find
打印出结果?./
$ find
./file1
./file2
./file3
不打印出来的原因是什么?
$ find
file1
file2
file3
答案1
这原因为什么你看到这个是因为 GNU 的开发者find
选择了提供“合理”的行为find
当没有给出路径时。相比之下,POSIX没有声明该参数是可选的:
这
find
实用程序应从目录层次结构递归下降路径指定的每个文件,对遇到的每个文件计算由 OPERANDS 部分中描述的原色组成的布尔表达式。每个路径操作数应在提供时按原样进行评估,包括所有尾随<slash>
人物;层次结构中遇到的其他文件的所有路径名应包含级联当前路径操作数,a<slash>
如果当前路径操作数不以 1 结尾,则文件名相对于路径操作数。相关部分不应包含点或点-点组件,也不应包含尾随部分字符,并且只有单个<slash>
路径名组件之间的字符。
您可以在每个概要中看到差异。 GNU 有(按照惯例)方括号中的可选项目:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...]
[expression]
而 POSIX 并不表明它可以是可选的:
find [-H|-L] path... [operand_expression...]
在 GNU 程序中,这是在ftsfind.c
:
如果(空) { /* * 我们在这里使用临时变量,因为有些动作会修改 * 临时路径。因此,如果我们使用字符串常量, * 我们得到一个核心转储。最好的例子是如果我们说 *“find -printf %H”(注意,不是“find .-printf %H”)。 */ char 默认路径[2] = "."; 返回查找(默认路径); }
和一个字面意思"."
是为了简单起见而使用的。所以你会看到相同的结果
find
和
find .
因为(并且 POSIX 同意)给定小路将用于为结果添加前缀(参见上文级联)。
只需做一点工作,就可以确定该功能首次添加的时间;它存在于1996 年首次创建“findutils”(看find.c
):
+ /* If no paths are given, default to ".". */
+ for (i = 1; i < argc && strchr ("-!(),", argv[i][0]) == NULL; i++)
+ process_top_path (argv[i]);
+ if (i == 1)
+ process_top_path (".");
+
+ exit (exit_status);
+}
从 find 3.8 的变更日志来看,这显然是
Sat Dec 15 19:01:12 1990 David J. MacKenzie (djm at egypt)
* find.c (main), util.c (usage): Make directory args optional,
defaulting to "."
答案2
通常,人们会对文件进行后处理,在这种情况下,以./
.特别是,如果文件名以 开头-
,则后续命令可以将该文件名解释为选项。 ./
避免了这种情况。
例如,考虑包含以下文件的目录:
$ ls
--link --no-clobber
现在,想象一下如果提供的文件名前面没有前缀./
,该命令将如何工作:
$ find -type f -exec cp -t ../ {} +
我们可以用问题find
本身来说明。让我们在与上面相同的目录中运行它。以下作品:
$ find ./*
./--link
./--no-clobber
以下失败:
$ find *
find: unknown predicate `--link'
Try 'find --help' for more information.
答案3
该find
命令需要搜索路径。如果我们不指定任何内容,它将使用当前目录(.
)作为其起点。同样,如果您传递路径,例如/tmp
,它会将其视为起点。因此结果也是如此。
如果当前目录:
$ find
or
$ find .
output:
./file1
./file2
./file3
如果/tmp
目录:
$ find /tmp
output:
/tmp/file4
/tmp/file5
如果abc
目录在当前目录下:
$ find abc
output:
abc/file6
abc/file7
如果当前目录下有多个目录:
$ find fu bar
output:
fu/file10
fu/file11
bar/file8
bar/file9
答案4
如果未指定路径,find
命令将假定${PWD}
为路径并将其打印在其输出中。用户不指定路径不会改变find
工作方式。默认情况下,find 始终适用于路径。