재귀 복사의 이상한 동작

재귀 복사의 이상한 동작

왜 이런 일이 발생하는지 설명할 수 있나요?

가장 구체적으로 말하면, 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

의 경우 cptarget은 명령줄의 마지막 인수입니다. 2/g마지막 매개변수로 지정했습니다 .

cp실행하기 전에 명령 매개변수가 확장됩니다. 1/*Expand to 1/a 1/b 1/c.Expand 2/*to 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

관련 정보