./file
为什么有些相对文件路径以, 而不是仅仅以 的形式显示file
?例如,当我这样做时:
find .
我得到这个输出:
./file1
./file2
./file3
除了让道路更加混乱之外,实际目的是什么?这并不是说它可以阻止我发生一些事故。两者都是相对路径,并且cat ./file1
工作方式与 相同cat file1
。
这种行为是来自find
命令,还是某个系统范围的 C 库?
好的,我明白为什么使用./file
for-exec
构造是必要的(以确保我有... | xargs rm ./-i
, 而不是... | xargs rm -i
)。
但是在什么情况下./
使用-print
语句时缺少会破坏任何东西呢?
我正在尝试构建任何破坏某些内容的语句:
touch -- -b -d -f -i
find -printf '%P\n' | sort
-b
-d
-f
-i
一切正常。
出于好奇,我如何构建一个-print
声明来证明这个问题?
答案1
此行为来自find
, 和由 POSIX 指定:
每个小路操作数应按照提供时的原样进行评估,包括所有尾随 <slash> 字符;层次结构中遇到的其他文件的所有路径名应包含当前文件的串联小路操作数,如果当前路径操作数不以 1 结尾,则为 <slash>,以及相对于小路操作数。
默认操作-print
,将完整路径名输出到标准输出。
find
输出从命令行上给出的路径开始找到的文件的路径。
find .
要求find
查找.
及其子目录下的文件,并显示以./
;开头的结果。
find foo
会做同样的事情,但从 开始foo
,并且会产生从 开始的结果foo/
。
我不认为find
这是专门为了防止问题文件名不带前缀;相反,它这样做是为了保持一致性 - 无论作为参数提供的路径如何, 的输出-print
始终从该路径开始。
通过 GNU 实现,您可以使用in 代替 来find
从打印文件的开头去除初始路径。例如,使用or ,您将得到这些文件的替代或。-printf '%P\n'
-print
find foo/bar -name file -printf '%P\n'
find . -name file -printf '%P\n'
dir/file
foo/bar/dir/file
./dir/file
更一般地说,./
作为前缀可以帮助防止错误,例如如果您的文件名称以破折号开头;例如,如果您有一个名为 的文件-f
,rm -f
则不会删除它,但rm ./-f
会删除它。
当使用 shell 或exec*p()
标准 C 函数(以及其他语言中的等效函数)运行命令时,当命令名称不包含 时/
,将查找命令的路径,$PATH
而不是将其解释为相对路径(当前工作目录)。这同样适用于多个 shell 的.
/特殊内置函数的参数source
(包括 POSIX 兼容的sh
实现)。在这种情况下使用./cmd
而不是cmd
,这是指定相同相对路径的另一种方法,但使用 a/
是通常调用存储在当前工作目录中的命令的方式。
答案2
当我们谈论普通文件时,没有实际用途。但当我们谈论可执行文件时,它就有意义了。当您执行时(并且file1
位于当前目录中):
file1
shell 在 PATH 变量中的所有路径中搜索可执行文件。仅当 PATH 中有类似以下内容时才会执行此文件:(:.:
当前目录在 PATH 搜索中)。您可以file1
通过以下方式运行位于当前目录中的 ,而不是这种非常不明智的设置:
./file1
答案3
Linux 中的许多命令-
作为表示 stdin 的特殊文件接收,因此要指示名称确实为 的文件,-
您必须使用./-
.看
此外-
也用于参数,因此如果您想使用以-
like开头的文件名--file
,则必须使用./--file
.这也是为什么如果你想 grep 一个以 开头的模式,-
你必须使用grep -e --pattern
.看如何“减去”名为“-”的文件?