Cách sao chép tập tin từ thư mục mà không cần chính thư mục


39

Tôi đang cố gắng sao chép các tập tin và thư mục con từ thư mục A mà không có chính A. Chẳng hạn, một thư mục chứa tiếp theo:

| file1.txt   
| file2.txt    
| subfolder1   

Thực hiện lệnh tiếp theo cho tôi kết quả sai:

sudo cp -r /home/username/A/ /usr/lib/B/

Kết quả là

/usr/lib/B/A/...copied files...

thay vì..

/usr/lib/B/...copied files...

Làm thế nào tôi có thể đạt được cái mong đợi mà không có thư mục gốc

Câu trả lời:


67

cp nâng cao

cp -r /home/username/A/. /usr/lib/B/

Điều này đặc biệt tuyệt vời vì nó hoạt động cho dù thư mục đích đã tồn tại.

vỏ quả cầu

Nếu không có quá nhiều đối tượng trong thư mục thì bạn có thể sử dụng shell globalbing:

mkdir -p /usr/lib/B/
shopt -s dotglob
cp -r /home/username/A/* /usr/lib/B/

rsync

rsync -a /home/username/A/ /usr/lib/B/

/cuối đường dẫn nguồn là quan trọng; hoạt động cho dù thư mục đích đã tồn tại.

tìm thấy

mkdir -p /usr/lib/B/
find /home/username/A/ -mindepth 1 -maxdepth 1 -exec cp -r -t /usr/lib/B/ {} +

hoặc nếu bạn không cần thư mục con trống:

find /home/username/A/ -mindepth 1 -type f -exec cp --parents -t /usr/lib/B/ {} +

(không có mkdir)


Cái đầu tiên hoạt động tốt! Bất kỳ ý tưởng tại sao nhà / tên người dùng / A / * (với biểu tượng ngôi sao) không có ý nghĩa? Biến thể với dấu chấm ở cuối đã giúp tôi, cảm ơn!
Pushandpop

@pushandpop A/*có ý nghĩa nhưng có những tình huống nó không hoạt động.
Hauke ​​Laging 25/1/2015

3
shoptbashcụ thể. Với zsh, sử dụng *(D). với ksh93, FIGNORE='@(.|..)'. cp -tlà GNU cụ thể. Một findcái sẽ không hoạt động đúng vì nó sẽ sao chép cả hai A/và nội dung của nó (bao gồm cả các thư mục con) nhiều lần.
Stéphane Chazelas

1
Bạn cũng muốn -maxdepth 1( -mindepth-maxdepthhiện là các tiện ích mở rộng GNU cũng được hỗ trợ bởi một vài người khác. Có thể find .../. ! -name . -prune -exec ....)
Stéphane Chazelas

@ StéphaneChazelas Tôi đoán có một lỗi đánh máy ở đâu đó. find .../.gây ra lỗi ở đây
Hauke ​​Laging 25/1/2015

10

Nếu trên hệ thống GNU, từ man cp:

   -T, --no-target-directory
          treat DEST as a normal file

Điều này cho phép bạn viết cp -rT /home/username/A/ /usr/lib/B/để làm chính xác điều đúng.


Đây phải là câu trả lời được chấp nhận, điều này phù hợp hơn so với shell shellbing hoặc sử dụng cái gì khác hơn cp. Nhưng điều đó đúng là -Tsẽ không hoạt động với một người không phải GNU cp.
noraj

3

Nói cpđể sao chép nội dung của thư mục chứ không phải chính thư mục:

sudo cp -r /home/username/A/* /usr/lib/B/

Cảm ơn! Nhưng nó nói: / usr / lib / B / không phải là một thư mục
Pushandpop

Bạn sẽ cần để shopt -s dotgloblàm việc này nếu có bất kỳ dấu chấm nào trong đó /home/username/A/.
talkloud

1
@pushandpop tốt, vâng. Đó là mục tiêu bạn có trong câu hỏi của bạn nên tôi cho rằng đó là một thư mục. Bạn cần tạo mục tiêu trước khi cố gắng sao chép tệp vào đó.
terdon
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.