Làm thế nào tôi có thể sao chép một tập tin và tạo các thư mục đích cùng một lúc?


20

Tôi muốn cp aaa/deep/sea/blob.psdđếnbbb/deep/sea/blob.psd

Làm cách nào để sao chép nếu thư mục deepseathư mục không tồn tại bbbđể sao chép cả hai tạo thư mục cần thiết và sao chép tệp?

Ngay bây giờ tôi nhận được
No such file or directorynhư sâu và biển không tồn tại.

Tôi nhìn qua các trang trợ giúp của người đàn ông và các câu hỏi khác nhưng không có gì nhảy ra khỏi tôi.

Gần nhất tôi đã sử dụng rcpcho thư mục:

rcp -r aaa/deep/sea/ bbb/deep/sea/

mặc dù điều này sao chép toàn bộ thư mục và nội dung và tôi chỉ muốn một tệp. Cố gắng làm điều đó đã chocp: cannot create regular file bbb/deep/sea/blob.psd' such file or directory

Câu trả lời:


19

Cố gắng sử dụng chức năng tiếp theo như vậy cho tình huống như vậy:

copy_wdir() { mkdir -p -- "$(dirname -- "$2")" && cp -- "$1" "$2" ; }

và sử dụng nó như là

copy_wdir aaa/deep/sea/blob.psd bbb/deep/sea/blob.psd

Nhân tiện, GNU cpcó một --parentstùy chọn. Nó thực sự gần với những gì bạn muốn, nhưng không chính xác.
Nó cũng sẽ tạo aaathư mục mà bạn không cần. Tuy nhiên, trước tiên bạn có thể cd aaavà sao chép như:

cd aaa && cp --parents deep/sea/blob.psd ../bbb/

24

Thật dễ dàng khi sử dụng installchương trình từ coreutils thường được sử dụng cho mục đích này bằng cách xây dựng các hệ thống như automake :

install -D /path/to/source /path/to/destination

Lưu ý rằng installtạo tất cả các phần của đường dẫn giống như mkdir -p, xem man install. Tôi tò mò tại sao bạn không bao gồm lý do tại sao bạn muốn làm điều đó. Gọi mkdircprất dễ dàng.


2
Tôi nghĩ rằng có rất nhiều câu trả lời hay cho câu hỏi này, nhưng câu hỏi này nhận được phiếu bầu của tôi vì nó dễ mang theo nhất. Câu rsynctrả lời sẽ chỉ tạo 1 thư mục và paxdường như không phổ biến.
Patrick

Sử dụng -dthay vì -Dtrên máy Mac.
Matt M.

lưu ý rằng lệnh này tạo các tệp đích với quyền 755( rwxr-xr-x), có thể không mong muốn. bạn có thể chỉ định một cái gì đó khác bằng công -mtắc, nhưng tôi không thể tìm ra cách nào để giữ quyền truy cập tệp :(
törzsmókus

6

Với các lệnh tiêu chuẩn (POSIX / Unix), bạn đã có:

pax -rws ':^:dest/dir/:' file .

1
Hấp dẫn. Tôi chưa bao giờ nghe nói về pax trước đây. Mặc dù tôi thích khái niệm của nó. Thật không may, mặc dù trong POSIX, có vẻ như rất ít các distro cài đặt nó theo mặc định :-(
Patrick

@Patrick - nếu bạn bỏ qua đến hết info tar- ở đâu đó xung quanh phần liên quan đến tính di động - tôi nghĩ bạn sẽ thấy rằng GNU tartuyên bố là hoàn toàn paxtương thích. Dù sao thì tôi cũng đã làm, mặc dù tôi chưa bao giờ loay hoay đưa những yêu sách đó vào thử nghiệm.
mikeerv

5

Tôi không biết cách sử dụng nó cp, nhưng chắc chắn là có thể sử dụng rsync:

$ rsync sourcefile dir/

nơi mà dirmột thư mục không phải tồn tại. Có rất nhiều cách khác để đạt được điều tương tự bằng cách sử dụng các lệnh khác.


3
Bạn cần rsync -Rlưu giữ thư mục bá đạo
glenn jackman

@glennjackman Thật vậy, việc sử dụng 'đúng cách' rsynccần nhiều tùy chọn hơn, nhưng câu hỏi chỉ đơn giản là về việc tạo một thư mục đích không tồn tại, do đó câu trả lời ngắn gọn của tôi :)
mjturner

1
Ít nhất GNU cp--parentstùy chọn.
peterph

2
@peterph Thật vậy, nhưng sau đó bạn bị hạn chế trong việc đặt tên thư mục đích
mjturner

4
cd aaa
pax -rw deep/sea/blob.psd ../bbb

Nếu bạn không có pax(nó bắt buộc bởi POSIX, như là một sự thay thế tiêu chuẩn của cpio và tar có quá nhiều sự không tương thích để chuẩn hóa), hãy sử dụng cpio -phoặc tar -cf - … | tar -xf -thay vào đó.

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.