Nếu tôi muốn sao chép tất cả các *.sotập tin từ srcđể dsttôi muốn làm:
cp src/*.so dst
Tuy nhiên, tôi muốn sao chép tất cả *.socá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 *.sotập tin từ srcđể dsttôi muốn làm:
cp src/*.so dst
Tuy nhiên, tôi muốn sao chép tất cả *.socá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
grepvượt xa các mẫu vỏ đơn giản được sử dụng trong -nametham số find. xargscũng mạnh hơn nhiều so với -exectham 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 dotglobtù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 dstvớ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 cpbâ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 -tcờ : ... | xargs cp --parents -t dst.
... | xargs cp {} --parents -t dst.
--parentskhô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/ \;
cpquá trình : ... -exec cp -t dst/ {} +.
-execvớ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 cpcho mỗi tập tin. Với +cú pháp findthay 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/{}
findcó 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/ ';'