递归复制中的奇怪行为

递归复制中的奇怪行为

有人可以解释为什么会发生这种情况吗?

最具体地说:为什么 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

相关内容