我正在读LPIC-1 PDF。上面写着:
通常,要复制我们使用的目录的所有内容: cp -r SOURCE_PATH/* DEST_PATH
但我不明白为什么没有*的-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发布于 2022-09-01 16:53:21
cp -r源路径/* 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确保不会发生这种情况(确保复制或失败,而不是目录;还请参阅GNU cp的-t选项)。
通过以下方式:
cp -r SOURCE_PATH DEST_PATH
您要将SOURCE_PATH目录(及其所有内容(包括隐藏文件)递归地复制到DEST_PATH中(假设它再次存在并且是一个目录),因此您将得到DEST_PATH/SOURCE_PATH,DEST_PATH/SOURCE_PATH/{.git,dir,file}。所以它给出了一个完全不同的结果。
在这里,要将SOURCE_PATH的所有内容(包括隐藏文件)复制到DEST_PATH中,而不是SOURCE_PATH本身,您最好使用:
cp -r SOURCE_PATH/. DEST_PATH除了包含隐藏文件(假设为zsh,您也可以使用cp -r SOURCE_PATH/*(D) DEST_PATH/)之外,如果SOURCE_PATH有太多的非隐藏文件,它的优点还包括不会出现太多的参数错误,如果SOURCE_PATH是空的,则不会报告错误。而且,如果DEST_PATH不存在,它将作为SOURCE_PATH的副本创建。
使用cp的GNU实现,您可以对以下内容进行同样的操作:
cp -rT SOURCE_PATH DEST_PATH(-T,又名--no-target-directory强制复制-而不是拷贝--即使目标是目录)。
https://unix.stackexchange.com/questions/715774
复制相似问题