我正在阅读 LPIC-1 PDF。它说:
一般来说,要复制目录的所有内容,我们使用:
cp -r 源路径/* 目标路径
但我不明白为什么 -r 选项本身没有 * 还不够?应该是对的吧?
谢谢。
编辑:我尝试过,结果很有趣。首先,如果目标不存在,源中的 * 通配符会给出错误,因为没有目标目录。如果没有 * cp 则复制所有隐藏文件,包括隐藏在顶部目录和子目录中的文件。
另一方面,如果目标存在并且我们在源中使用 * 通配符,则 cp 复制顶部的所有文件(隐藏文件除外),但包括子目录隐藏文件。
[rocky@rocky ~]$ tree -a test1
test1
├── .hiddentestfile1
├── test2
│ ├── .hiddentestfile2
│ └── testfile2
└── testfile1
1 directory, 4 files
[rocky@rocky ~]$ cp -r test1/* newdest
cp: target 'newdest' is not a directory
[rocky@rocky ~]$ cp -r test1/ newdest
[rocky@rocky ~]$ tree -a newdest
newdest
├── .hiddentestfile1
├── test2
│ ├── .hiddentestfile2
│ └── testfile2
└── testfile1
1 directory, 4 files
[rocky@rocky ~]$ rm -r newdest
[rocky@rocky ~]$ mkdir newdest
[rocky@rocky ~]$ cp -r test1/* newdest
[rocky@rocky ~]$ tree -a newdest
newdest
├── test2
│ ├── .hiddentestfile2
│ └── testfile2
└── testfile1
1 directory, 3 files
答案1
cp -r SOURCE_PATH/* DEST_PATH
将每个(非隐藏)文件或目录及其内容递归复制到 DEST_PATH 中(假设这是目录或目录的符号链接)。
然后,如果 SOURCE_PATH 包含例如file
,dir
和.git
,则最终会得到DEST_PATH/file
和DEST_PATH/dir
。
请注意,如果DEST_PATH
不存在或不是目录并且SOURCE_PATH
仅包含一个非隐藏文件或目录(例如SOURCE_PATH/file
),那么它将变成cp -r SOURCE_PATH/file DEST_PATH
(复制到而不是复制到),这意味着将创建(或覆盖) DEST_PATH作为 的副本file
。在命令中附加/
到 DEST_PATH 可确保不会发生这种情况(保证复制到或失败不是目录;另请参阅-t
GNU 选项cp
)。
和:
cp -r SOURCE_PATH DEST_PATH
您将 SOURCE_PATH 目录(及其所有内容递归地,包括隐藏文件)复制到 DEST_PATH (再次假设它存在并且是一个目录),因此您最终会得到DEST_PATH/SOURCE_PATH
, DEST_PATH/SOURCE_PATH/{.git,dir,file}
。所以它给出了完全不同的结果。
在这里复制所有内容SOURCE_PATH(包括隐藏文件)而不是 SOURCE_PATH 本身进入 DEST_PATH,您宁愿使用:
cp -r SOURCE_PATH/. DEST_PATH
除了还包括隐藏文件(假设是 zsh,您也可以使用cp -r SOURCE_PATH/*(D) DEST_PATH/
),它还具有不会因以下原因而失败的优点:争论太多如果SOURCE_PATH有太多非隐藏文件则报错,如果SOURCE_PATH为空则不报错。此外,如果 DEST_PATH 不存在,它最终会被创建为 SOURCE_PATH 的副本。
通过 GNU 实现cp
,您可以执行相同的操作:
cp -rT SOURCE_PATH DEST_PATH
(-T
又名--no-target-directory
强制复制到而不是复制到,即使目标是目录)。