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

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

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

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

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

答案1

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

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

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

$ cp -av . ../foo/
‘./file1’ -> ‘../foo/./file1’
‘./file2’ -> ‘../foo/./file2’

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

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

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

相关内容