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