有人可以解释为什么会发生这种情况吗?
最特别的是:为什么 1 的内容被复制到 f?为什么 f 被复制到 g?
$ tree
.
0 directories, 0 files
$ mkdir 1
$ mkdir 2
$ touch 1/a
$ touch 1/b
$ mkdir 1/c
$ touch 1/c/x
$ tree
.
??? 1
? ??? a
? ??? b
? ??? c
? ??? x
??? 2
3 directories, 3 files
$ cp -r 1/* 2/*
zsh: no matches found: 2/*
$ cp -r 1/* 2/*
$ mkdir 2/f
$ mkdir 2/g
$ cp -r 1/* 2/*
$ tree
.
??? 1
? ??? a
? ??? b
? ??? c
? ??? x
??? 2
??? f
??? g
??? a
??? b
??? c
? ??? x
??? f
7 directories, 6 files
Run Code Online (Sandbox Code Playgroud)
对于cp,目的地是命令行上的最后一个参数。您已指定2/g为最后一个参数。
在cp执行之前,对命令参数进行了扩展。1/*扩展到1/a 1/b 1/c. 2/*扩展到2/f 2/g. 最后执行的命令是cp -r 1/a 1/b 1/c 2/f 2/g,它将所有参数(除了最后一个)复制到2/g。
如果您打算将内容复制到2,则不需要第二个 glob,将命令cp -r 1/* 2/. 如果您打算将内容复制到多个目的地,则不能仅使用cp; 您可以使用一个小循环,如下所示:
#!/bin/sh
for path in ./2/*/; do
cp -r 1/* "$path"
done
Run Code Online (Sandbox Code Playgroud)