递归复制中的奇怪行为

MPV*_*MPV 7 cp recursive

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

最特别的是:为什么 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)

Sha*_*off 8

对于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)