Sử dụng thiết bị đầu cuối Mac OS X để sao chép lựa chọn các thư mục sang một vị trí mới, với hành vi hợp nhất


2

Tôi có một thư mục 'foo' chứa nhiều thư mục con, vd

foo
 |---20101
 |---20102
 |---20103
 |---20111
 |---20112
 |---20113

Có nhiều cách hơn thế, nhưng hy vọng nó giải thích được kịch bản. Bây giờ tôi muốn sao chép tất cả các thư mục từ thư mục này bắt đầu '2011' vào một anh chị em của 'foo' được gọi là 'bar'. Tuy nhiên, 'thanh' đã chứa một số thư mục có cùng tên

bar
 |---20111
 |---20113
 |---20114

Nội dung của thư mục nguồn và đích nên được hợp nhất. Lưu ý rằng tập lệnh cũng sẽ cần tạo một thư mục bar / 20112 vì nó không tồn tại.

Tôi chưa quen với kịch bản Mac Terminal và đã quản lý thành công để grep đúng thư mục

foo>ls | grep ^2011 

Danh sách các thư mục phù hợp, nhưng tôi không biết làm thế nào để chuyển nó sang một hoạt động sao chép thích hợp.

Câu trả lời:


7

Lệnh sao chép là cp. Nếu bạn cung cấp cho nó -rcờ (đệ quy), nó sẽ thực hiện chính xác những gì bạn muốn, nó sẽ sao chép các tệp vào các thư mục hiện có và tạo các thư mục mới khi thiếu thư mục đích.

Tuy nhiên, bạn không bao giờ nên phân tích đầu ra củals , bạn nên sử dụng findhoặc, thậm chí đơn giản hơn, bash globalbing :

cp -rv foo/2011* bar/

Nếu có các tệp cũng như các thư mục có tên bắt đầu 2011, hãy sử dụng find-exectùy chọn của nó sẽ áp dụng bất kỳ lệnh nào bạn cung cấp cho mọi thứ được tìm thấy bởi find(gọi là {}):

find foo/ -type d -name "2011*" -exec cp -rv '{}' bar/ \;

Trong trường hợp cụ thể này, không có lý do gì để lưu đầu ra của lệnh và chuyển nó tới cp. Điều này đôi khi là cần thiết mặc dù vậy đây là cách nó được thực hiện. Nói chung, đầu ra của một lệnh có thể được cung cấp làm đầu vào cho một lệnh khác nếu được đặt bên trong hôn mê đảo ngược hoặc $().

cp -rv `find foo/ -type d -name "2011*"` bar/

hoặc là

cp -rv $(find foo/ -type d -name "2011*") bar/

Ngoài ra, bạn có thể lặp qua các kết quả:

for dir in $(find foo/ -type d -name "2011*"); do cp -rv "$dir" bar/; done

Điều này trở nên phức tạp hơn nếu tên tệp / thư mục của bạn có thể chứa các ký tự đặc biệt hoặc dòng mới và tương tự, trong trường hợp đó bạn nên làm một cái gì đó như thế này:

find foo/ -type d -name "2011*" | while IFS= read -r dir; do 
       cp -rv "$dir" bar/; 
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.