为什么`cp -a . /dir` 复制内容而不是目录?

dvd*_*rgn 3 shell directory cp

我想复制我目前所在的目录。我试过了 cp -a . ~/xyz

它复制了目录的内容,但这有效:cp -a "$(pwd)" ~/xyz
[根据需要,这也复制了包装内容的目录。]

Dot 似乎在做 Splat 会做的事情......为什么不起作用.

cjm*_*cjm 5

它这样做是因为.它不是可用于创建子目录的名称。

cp -a . ~/xyz复制./file1~/xyz/./file1./file2~/xyz/./file2等。但是~/xyz/./file1~/xyz/file1是一样的,所以效果是将当前目录的内容复制到~/xyz

如果您添加--verbose选项以cp在复制时显示每个路径名,您可以看到这一点:

$ cp -av . ../foo/
‘./file1’ -> ‘../foo/./file1’
‘./file2’ -> ‘../foo/./file2’
Run Code Online (Sandbox Code Playgroud)

.*这里之间的一个显着区别是cp -a . /dir将复制隐藏文件,不像*(不匹配隐藏文件)。

~*是外壳元字符,这意味着它们在cp看到它们之前被外壳扩展。另一方面,.是一个普通的目录条目(恰好指向包含它的目录)。有可能cp包含检测.递归副本的来源并替换目录名称的代码,但它没有,可能是因为没有人认为它很重要。

另外,它应该使用什么名称?目录比文件更简单,因为文件系统通常不允许多个硬链接到一个目录(除了...条目)。但这不考虑符号链接。现代 shell 通常会在您通过符号链接进入目录时进行跟踪,并将其反映在pwd.

  • @dvdrtrgn `.` 不是扩展,而是硬链接。 (2认同)