Cp
遞歸複製中的奇怪行為
有人可以解釋為什麼會這樣嗎?
最具體地說:為什麼一個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