Sao chép tập tin từ một thư mục vào một thư mục hiện có


248

Trong bash tôi cần phải làm điều này:

  1. lấy tất cả các tập tin trong một thư mục

  2. sao chép chúng vào một thư mục hiện có

Làm thế nào để tôi làm điều này? Tôi đã thử cp -r t1 t2(cả t1 và t2 đều là các thư mục hiện có, t1 có tệp trong đó) nhưng nó đã tạo một thư mục có tên t1 bên trong t2, tôi không muốn điều đó, tôi cần các tệp trong t1 để đi trực tiếp vào t2. Làm thế nào để tôi làm điều này?


11
Tại sao điều này đã bị đóng cửa? Sẽ là tùy ý nếu một lệnh bash là một lệnh tích hợp hoặc bên ngoài (ví dụ printf tồn tại như cả hai trên hầu hết các hệ thống), vì vậy các cpcâu hỏi có thể được xem là bashcâu hỏi, là ngôn ngữ lập trình. Tôi chưa bao giờ thấy một câu hỏi Python nói về sao chép tập tin được đóng lại.
Ciro Santilli 郝海东 冠状 病 事件


Tôi đã tìm kiếm một lời nhắc về cú pháp của lệnh sao chép shell Bash và tôi vui mừng báo cáo rằng các lệnh này dường như cũng hoạt động chống lại hệ thống tệp NTFS cơ bản trên bản cài đặt Windows của tôi.
David A. Gray

Câu trả lời:


396

Những gì bạn muốn là:

cp -R t1/. t2/

Dấu chấm ở cuối bảo nó sao chép nội dung của thư mục hiện tại, chứ không phải chính thư mục đó. Phương pháp này cũng bao gồm các tập tin và thư mục ẩn.


2
Tôi thực sự thích cú pháp này, nhưng vì một số lý do, nó không hoạt động mv. Có ai biết tại sao không?
Martin von Wittich

2
Kinh ngạc. Tài liệu này ở đâu? Là POSIX hay phần mở rộng?
Ciro Santilli 郝海东 冠状 病 事件

9
@CiroSantilli 事件 法轮功 包 卓 Nếu bạn sao chép một thư mục, cp sẽ tạo một thư mục và sao chép tất cả các tệp vào đó. Nếu bạn sử dụng thư mục giả vờ gọi là ".", Giống như thư mục đang giữ nó, bản sao sẽ hoạt động theo cách này. Giả sử t1 chứa một tệp gọi là "tệp". cp sẽ thực hiện thao tác tương đương với "cp t1 /./ tệp t2 /./". Nó đang sao chép thư mục ".", Nhưng sao chép tệp vào t2 của "." thư mục loại bỏ "./" vì "t2 /./" giống như "t2 /". Về mặt kỹ thuật, điều này có nghĩa là POSIX được xây dựng trong hành vi ... nhưng có lẽ không phải theo cách bạn có thể mong đợi!
nổi bật

35

Nếu bạn muốn sao chép một cái gì đó từ một thư mục vào thư mục hiện tại , hãy làm điều này:

cp dir1/* .

Điều này giả định rằng bạn không cố gắng sao chép các tập tin ẩn.


20
Bỏ lỡ các tập tin ẩn.
Ciro Santilli 郝海东 冠状 病 事件

1
Cũng thất bại đối với một số lượng lớn tệp (vì '*' không thể mở rộng thành vô số tệp ..) y
moritzschaefer

32
cp dir1/* dir2

Hoặc nếu bạn có các thư mục bên trong dir1 mà bạn cũng muốn sao chép

cp -r dir1/* dir2

3
Tùy thuộc vào cách trình bao của bạn được cấu hình, có thể bạn sẽ cần sử dụng "dir1 / * dir1 /.*" thay vì "dir1 / *" nếu bạn cũng muốn bắt các tệp ẩn.
ssokolow

2
Sao chép dir1/.*không phải là một ý tưởng tốt, vì nó sao chép dir1 / .. (tức là cha mẹ của thư mục mà bạn thực sự đang cố gắng sao chép). Nó cũng sao chép dir1 /. điều này là tốt, ngoại trừ việc nó đã được sao chép (hầu hết), vì vậy bạn đang thực hiện công việc hai lần.
Gordon Davisson

1
Bạn có thể dir1/.*giải quyết vấn đề / tập tin ẩn bằng cách cd-ing vào thư mục bạn muốn sao chép và sau đó gọi nó là .. Vì vậy, nếu bạn muốn sao chép tất cả các tệp bao gồm các tệp ẩn từ một thư mục vào một thư mục hiện có, bạn có thể: cd [source dir], cp . [path to destination dir, with no trailing slash].
RobW

8

Giả sử t1 là thư mục chứa các tệp trong đó và t2 là thư mục trống. Những gì bạn muốn là một cái gì đó như thế này:

sudo cp -R t1/* t2/

Hãy nhớ rằng, ví dụ đầu tiên, t1 và t2 phải là các đường dẫn đầy đủ hoặc các đường dẫn tương đối (dựa trên vị trí của bạn). Nếu bạn muốn, bạn có thể điều hướng đến thư mục trống (t2) và làm điều này:

sudo cp -R t1/* ./

Hoặc bạn có thể điều hướng đến thư mục có tệp (t1) và thực hiện việc này:

sudo cp -R ./* t2/

Lưu ý: Dấu * (hoặc ký tự đại diện) là viết tắt của tất cả các tệp và thư mục. Cờ -R có nghĩa là đệ quy (mọi thứ bên trong mọi thứ).


2
cp -R t1/ t2

Dấu gạch chéo trên thư mục nguồn thay đổi ngữ nghĩa một chút, do đó, nó sao chép nội dung chứ không phải chính thư mục. Nó cũng tránh được các vấn đề với các tập tin toàn cầu và vô hình mà câu trả lời của Bertrand có (sao chép t1/*bỏ lỡ các tập tin vô hình, sao chép `t1 / * t1 /.* 'bản sao t1 /. Và t1 / .., mà bạn không muốn).


Giải pháp của bạn không hoạt động, ít nhất là không phải trên bản cài đặt của tôi ( $ mkdir t1 $ mkdir t2 $ touch t1/one $ touch t1/two $ touch t1/.three $ cp -R t1/ t2 $ ls t2/ t1 ubfox 12.10) (xin lỗi không có codeformat trong các bình luận, phiên bản có thể đọc được tại pastebin.com/yszSxV6G )
zpon 6/213

2

Tùy thuộc vào một số chi tiết bạn có thể cần phải làm một cái gì đó như thế này:

r=$(pwd)
case "$TARG" in
    /*) p=$r;;
    *) p="";;
    esac
cd "$SRC" && cp -r . "$p/$TARG"
cd "$r"

... Điều này về cơ bản thay đổi vào thư mục SRC và sao chép nó vào mục tiêu, sau đó quay trở lại khi bạn bắt đầu.

Việc quấy rối thêm là để xử lý các mục tiêu tương đối hoặc tuyệt đối.

(Điều này không phụ thuộc vào ngữ nghĩa tinh tế của cpchính lệnh ... về cách nó xử lý các đặc tả nguồn có hoặc không có dấu / ... vì tôi không chắc chúng có ổn định, di động và đáng tin cậy không chỉ GNU cpvà tôi không biết liệu họ có tiếp tục như vậy trong tương lai không).


1

Đối với bên trong một số thư mục, điều này sẽ được sử dụng đầy đủ vì nó sao chép tất cả nội dung từ "thư mục 1" sang thư mục mới "thư mục 2" trong một số thư mục.

$ (pwd) sẽ nhận đường dẫn cho thư mục hiện tại.

Lưu ý dấu chấm (.) Sau thư mục1 để lấy tất cả nội dung trong thư mục1

cp -r $(pwd)/folder1/. $(pwd)/folder2
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.