Comportamento estranho na cópia recursiva

7

Alguém poderia explicar por que isso acontece?

Mais especificamente: Por que o conteúdo de um 1 é copiado para f? E por que f é copiado para 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
    
por MPV 22.01.2012 / 00:30

1 resposta

8

Para cp , o destino é o último argumento na linha de comando. Você especificou 2/g como o último argumento.

Antes de cp ser executado, os parâmetros do comando são expandidos. 1/* expande para 1/a 1/b 1/c . 2/* expande para 2/f 2/g . O comando final executado é cp -r 1/a 1/b 1/c 2/f 2/g , que copiará todos os argumentos (exceto o último) para 2/g .

Se você pretende copiar as coisas para 2 , o segundo glob não é necessário, fazendo o comando cp -r 1/* 2/ . Se você pretende copiar as coisas para vários destinos, não é possível especificar isso com apenas cp ; você pode usar um pequeno loop, como o seguinte:

#!/bin/sh
for path in ./2/*/; do
  cp -r 1/* "$path"
done
    
por 22.01.2012 / 00:33

Tags