Các trang hướng dẫn (hoặc GNU thủ công trực tuyến ) khá nhiều giải thích tất cả mọi thứ.
lệnh find -exec {} \;
Đối với mỗi kết quả, command {}
được thực thi. Tất cả các lần xuất hiện {}
đều được thay thế bằng tên tệp. ;
được đặt trước bằng một dấu gạch chéo để ngăn trình bao thông dịch nó.
lệnh find -exec {} +
Mỗi kết quả được nối vào command
và thực thi sau đó. Có tính đến các giới hạn về độ dài lệnh, tôi đoán rằng lệnh này có thể được thực thi nhiều lần hơn, với trang hướng dẫn hỗ trợ tôi:
tổng số lần gọi lệnh sẽ ít hơn nhiều so với số tệp phù hợp.
Lưu ý trích dẫn này từ trang hướng dẫn sử dụng:
Dòng lệnh được xây dựng giống như cách mà xargs xây dựng các dòng lệnh của nó
Đó là lý do tại sao không có ký tự nào được phép giữa {}
và +
ngoại trừ khoảng trắng. +
làm cho find phát hiện rằng các đối số nên được thêm vào lệnh giống như xargs
.
Giải pháp
May mắn thay, việc triển khai GNU mv
có thể chấp nhận thư mục đích làm đối số, với một trong hai -t
hoặc tham số dài hơn --target
. Cách sử dụng sẽ là:
mv -t target file1 file2 ...
find
Lệnh của bạn trở thành:
find . -type f -iname '*.cpp' -exec mv -t ./test/ {} \+
Từ trang hướng dẫn sử dụng:
-exec lệnh;
Thực thi lệnh; true nếu trạng thái 0 được trả về. Tất cả các đối số sau để tìm được coi là đối số của lệnh cho đến khi đối số bao gồm `; ' đang gặp phải. Chuỗi `{} 'được thay thế bằng tên tệp hiện tại đang được xử lý ở mọi nơi mà nó xuất hiện trong các đối số của lệnh, không chỉ trong các đối số chỉ có nó, như trong một số phiên bản của find. Cả hai cấu trúc này có thể cần phải được thoát (bằng dấu `\ ') hoặc được trích dẫn để bảo vệ chúng khỏi bị mở rộng bởi shell. Xem phần VÍ DỤ để biết các ví dụ về việc sử dụng tùy chọn -exec. Lệnh đã chỉ định được chạy một lần cho mỗi tệp phù hợp. Lệnh được thực hiện trong thư mục bắt đầu. Có những vấn đề bảo mật không thể tránh khỏi xung quanh việc sử dụng hành động -exec; bạn nên sử dụng tùy chọn -execdir để thay thế.
-exec lệnh {} +
Biến thể này của hành động -exec chạy lệnh được chỉ định trên các tệp đã chọn, nhưng dòng lệnh được tạo bằng cách thêm mỗi tên tệp đã chọn vào cuối; tổng số lần gọi lệnh sẽ ít hơn nhiều so với số tệp phù hợp. Dòng lệnh được xây dựng giống như cách mà xargs xây dựng các dòng lệnh của nó. Chỉ một phiên bản của `{} 'được phép trong lệnh. Lệnh được thực hiện trong thư mục bắt đầu.