Cp

遞歸複製中的奇怪行為

  • January 22, 2012

有人可以解釋為什麼會這樣嗎?

最具體地說:為什麼一個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

對於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

引用自:https://unix.stackexchange.com/questions/29666