Hành vi kỳ lạ trong bản sao đệ quy


7

Ai đó có thể giải thích tại sao điều này xảy ra?

Cụ thể nhất: Tại sao nội dung của 1 được sao chép vào f? Và tại sao f được sao chép vào 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

Tôi nghĩ rằng bạn có thêm một khoản cp -r 1/* 2/*trong đó - nó được thực hiện hai lần liên tiếp với các kết quả khác nhau (rõ ràng). Nó luôn luôn phải phàn nàn về việc không tìm thấy 2/*vì vỏ không thể mở rộng toàn cầu - không có gì phù hợp với nó. Và nội dung của 1không được sao chép fvào ví dụ này.
Shawn J. Goff

2
Nếu đích đến của cploại này không rõ ràng, bạn có thể thử --target-directory, ví dụ: cp --target-directory=2 fileglob1 fileglob2tôi thấy tùy chọn đó rất hữu ích trong các tập lệnh mà tôi không chắc chắn những gì ảm đạm sẽ hoạt động và những gì sẽ không; nó giúp ngăn ngừa vô tình ghi đè lên công cụ. (Một số phiên bản cpcho phép -t.)
Aaron D. Marasco

Câu trả lời:


8

Đối với cp, đích là đối số cuối cùng trên dòng lệnh. Bạn đã chỉ định 2/glàm đối số cuối cùng.

Trước khi cpđược thực thi, các tham số lệnh được mở rộng. 1/*mở rộng đến 1/a 1/b 1/c. 2/*mở rộng đến 2/f 2/g. Lệnh thực thi cuối cùng là cp -r 1/a 1/b 1/c 2/f 2/g, sẽ sao chép tất cả các đối số (ngoại trừ đối số cuối cùng) sang 2/g.

Nếu bạn đang có ý định sao chép mọi thứ vào 2, quả cầu thứ hai không cần thiết, hãy thực hiện lệnh cp -r 1/* 2/. Nếu bạn đang có ý định sao chép mọi thứ vào nhiều điểm đến, bạn không thể chỉ định điều đó chỉ bằng cp; bạn có thể sử dụng một vòng lặp nhỏ, như sau:

#!/bin/sh
for path in ./2/*/; do
  cp -r 1/* "$path"
done
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.