有人可以解释为什么会发生这种情况吗?
最具体地说:为什么 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
答案1
对于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