我想复制我目前所在的目录。我尝试过cp -a . ~/xyz
它复制了目录的内容,但这有效:cp -a "$(pwd)" ~/xyz
[根据需要,这也复制了包含内容的目录。]
Dot 似乎正在做 Splat 会做的事情......为什么不起作用.
?
答案1
这样做是因为.
不是可用于创建子目录的名称。
cp -a . ~/xyz
复制./file1
到~/xyz/./file1
、./file2
to~/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
.