Tôi đang cố chạy một lệnh tương tự như lệnh bên dưới trong tập lệnh bash. Nó nên tìm kiếm thông qua tất cả các thư mục con của $sourcedir
và sao chép tất cả các tệp thuộc một loại nhất định vào cấp gốc $targetdir
.
#!/bin/bash
# These are set as arguments to the script, not hard-coded
sourcedir="/path/to/sourcedir"
targetdir="/path/to/targetdir"
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2/`basename "$1"`"' "{}" "$targetdir" \;
Điều này có vẻ khá gần, ngoại trừ việc {}
không được thông qua tại như $2
để-exec sh -c ...
Tôi muốn làm điều này càng gần "đúng cách" càng tốt, với sự khoan dung cho các ký tự đặc biệt trong tên tệp (cụ thể là các ký tự trích dẫn).
Chỉnh sửa: Tôi thấy mọi người đề nghị sử dụng xargs
hoặc lập luận chuỗi. Tôi đã có ấn tượng rằng điều này chỉ ổn đối với một số lượng đối số hạn chế. Ví dụ, nếu tôi có hàng ngàn tệp .jpg tôi đang cố sao chép từ một số thư mục thư viện vào một thư mục trình chiếu khổng lồ, liệu các giải pháp xâu chuỗi có còn hoạt động không?
Chỉnh sửa 2: Vấn đề của tôi là tôi đã bị thiếu một _
trước khi tùy chọn đầu tiên của tôi chuyển sang -exec
lệnh. Đối với bất kỳ ai tò mò về cách làm cho lệnh find hoạt động, hãy thêm _
và mọi thứ sẽ ổn:
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2"' _ "{}" "$targetdir" \;
Tôi đã chấp nhận một câu trả lời dưới đây mặc dù nó hoàn thành nhiệm vụ tương tự, nhưng hiệu quả và thanh lịch hơn.
xargs
được tạo ra, để tự động xử lý số lượng lớn đối số trên các lệnh thông thường có giới hạn. Cũng để xem xét, hầu hết các giới hạn đối số tối đa, đã được cải thiện rất nhiều cho các tiện ích GNU tiêu chuẩn. Bạn cũng sẽ thấy một lợi ích hiệu suất, tránh tất cả các nhánh quá trình, mà trên hàng ngàn tệp có liên quan.