Nếu tôi muốn sao chép tất cả các *.so
tập tin từ src
để dst
tôi muốn làm:
cp src/*.so dst
Tuy nhiên, tôi muốn sao chép tất cả *.so
các tệp từ src và nó sẽ chuyển sang dst
. Bất kì manh mối nào?
Nếu tôi muốn sao chép tất cả các *.so
tập tin từ src
để dst
tôi muốn làm:
cp src/*.so dst
Tuy nhiên, tôi muốn sao chép tất cả *.so
các tệp từ src và nó sẽ chuyển sang dst
. Bất kì manh mối nào?
Câu trả lời:
Thử:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
grep
vượt xa các mẫu vỏ đơn giản được sử dụng trong -name
tham số find
. xargs
cũng mạnh hơn nhiều so với -exec
tham số find
.
Nếu bạn đang sử dụng Bash, bạn có thể bật globstar
tùy chọn shell để khớp các tệp và thư mục theo cách đệ quy:
shopt -s globstar
cp src/**/*.so dst
Nếu bạn cần tìm các tệp có tên bắt đầu .
và / hoặc các tệp trong và dưới các thư mục có tên bắt đầu .
, hãy đặt dotglob
tùy chọn cũng (ví dụ: với shopt -s dotglob
). Bạn có thể đặt cả hai trong một lệnh:
shopt -s globstar dotglob
Tôi đã thử lệnh được đề xuất bởi Mike:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
nhưng nó đã kết thúc với việc bỏ tất cả các tệp vào thư mục dst
với các đường dẫn tương đối bị mất.
Để giữ các đường dẫn tương đối, lệnh cần được sửa đổi thành:
find src/ -type f | grep -i so$ | xargs -i cp {} dst/{}
dst
. Trong trường hợp không phải vậy, sử dụng cp --parents
. Ngoài ra, hãy chắc chắn để trích dẫn tên tập tin. Do đó: ... | xargs -i cp --parents "{}" dst
(lưu ý rằng đối số cuối cùng cp
bây giờ là "chỉ" thư mục đích). Lệnh có thể được thực hiện thậm chí ngắn hơn (và có thể nhanh hơn) bằng cách sử dụng -t
cờ : ... | xargs cp --parents -t dst
.
... | xargs cp {} --parents -t dst.
--parents
không có sẵn. Tôi đã sử dụng ditto
ở vị trí của nó: stackoverflow.com/questions/11246070/cp-parents-option-on-mac
Một cách khác để làm điều này là như thế này:
find src/ -type f -name "*.so" -exec cp {} dst/ \;
cp
quá trình : ... -exec cp -t dst/ {} +
.
-exec
với ;
, {}
được thay thế bằng một con đường tại một thời điểm. Bạn nhận được một riêng cp
cho mỗi tập tin. Với +
cú pháp find
thay thế {}
bằng nhiều kết quả (tối đa giới hạn do hệ thống xác định theo chiều dài của dòng lệnh; hạn chế: {}
phải là điều cuối cùng trước +
đó, do đó cp -t
). Tạo và chấm dứt một quá trình là điều tương đối tốn kém. Vì lý do này, nó tốt để sử dụng +
bất cứ khi nào bạn mong đợi nhiều kết quả. Trong trường hợp này, việc sao chép rất nhiều tệp có thể mất rất nhiều thời gian vì vậy sự khác biệt có thể vượt qua mà không được chú ý; tuy nhiên đó là một thực hành tốt.
Grep có thể được thay thế bằng cách sử dụng tên của find :
find src/ -type f -name "*.so" | xargs -i cp {} dst/{}
find
có thể thực hiện khớp mẫu và thực hiện các lệnh. Không cần phải đầu ra đầu ra của nó:find src/ -type f -name '*.so' -exec cp '{}' dst/ ';'