在递归操作中使用星号通配符有什么意义?

在递归操作中使用星号通配符有什么意义?

我正在阅读 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/fileDEST_PATH/dir

请注意,如果DEST_PATH不存在或不是目录并且SOURCE_PATH仅包含一个非隐藏文件或目录(例如SOURCE_PATH/file),那么它将变成cp -r SOURCE_PATH/file DEST_PATH(复制到而不是复制到),这意味着将创建(或覆盖) DEST_PATH作为 的副本file。在命令中附加/到 DEST_PATH 可确保不会发生这种情况(保证复制到或失败不是目录;另请参阅-tGNU 选项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强制复制到而不是复制到,即使目标是目录)。

相关内容