相对文件路径前面的“./”的实际用途是什么(在“find”的输出中)?

相对文件路径前面的“./”的实际用途是什么(在“find”的输出中)?

./file为什么有些相对文件路径以, 而不是仅仅以 的形式显示file?例如,当我这样做时:

find .

我得到这个输出:

./file1
./file2
./file3

除了让道路更加混乱之外,实际目的是什么?这并不是说它可以阻止我发生一些事故。两者都是相对路径,并且cat ./file1工作方式与 相同cat file1

这种行为是来自find命令,还是某个系统范围的 C 库?

好的,我明白为什么使用./filefor-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'-printfind foo/bar -name file -printf '%P\n'find . -name file -printf '%P\n'dir/filefoo/bar/dir/file./dir/file

更一般地说,./作为前缀可以帮助防止错误,例如如果您的文件名称以破折号开头;例如,如果您有一个名为 的文件-frm -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.看如何“减去”名为“-”的文件?

相关内容