Tôi muốn biết ý nghĩa của {} +trong execlệnh, và sự khác biệt giữa những gì là {} +và {} \;. Nói chính xác, sự khác biệt giữa hai điều này là gì:
find . -type f -exec chmod 775 {} +
find . -type f -exec chmod 775 {} \;
Tôi muốn biết ý nghĩa của {} +trong execlệnh, và sự khác biệt giữa những gì là {} +và {} \;. Nói chính xác, sự khác biệt giữa hai điều này là gì:
find . -type f -exec chmod 775 {} +
find . -type f -exec chmod 775 {} \;
Câu trả lời:
Sử dụng ;(dấu chấm phẩy) hoặc +(dấu cộng) là bắt buộc để chấm dứt các lệnh shell được gọi bởi -exec/ execdir.
Sự khác biệt giữa ;(dấu chấm phẩy) hoặc +(dấu cộng) là cách các đối số được truyền vào find -exec/ -execdirtham số. Ví dụ:
bằng cách sử dụng ;sẽ thực thi nhiều lệnh (riêng cho từng đối số),
Thí dụ:
$ find /etc/rc* -exec echo Arg: {} ';'
Arg: /etc/rc.common
Arg: /etc/rc.common~previous
Arg: /etc/rc.local
Arg: /etc/rc.netboot
Tất cả các đối số sau đây
findđược coi là đối số cho lệnh.Chuỗi
{}được thay thế bằng tên tệp hiện tại đang được xử lý.
bằng cách sử dụng +sẽ thực thi các lệnh ít nhất có thể (vì các đối số được kết hợp với nhau). Nó rất giống với cách xargshoạt động của lệnh, vì vậy nó sẽ sử dụng càng nhiều đối số trên mỗi lệnh càng tốt để tránh vượt quá giới hạn tối đa của đối số trên mỗi dòng.
Thí dụ:
$ find /etc/rc* -exec echo Arg: {} '+'
Arg: /etc/rc.common /etc/rc.common~previous /etc/rc.local /etc/rc.netboot
Dòng lệnh được xây dựng bằng cách nối thêm từng tên tệp được chọn ở cuối.
Chỉ một trường hợp
{}được cho phép trong lệnh.
Xem thêm:
Cho rằng lệnh find được dưới ba tệp:
fileA
fileB
fileC
Nếu bạn sử dụng -execvới dấu cộng ( +),
find . -type f -exec chmod 775 {} +
nó sẽ là:
chmod 775 fileA fileB fileC
Dòng lệnh được xây dựng bằng cách nối thêm mỗi tên tệp phù hợp ở cuối, giống như cách xargsxây dựng các dòng lệnh của nó. Tổng số lệnh gọi của lệnh ( chmodtrong trường hợp này) sẽ ít hơn nhiều so với số lượng tệp được khớp.
Nếu bạn sử dụng -execvới dấu chấm phẩy ( ;),
find . -type f -exec chmod 775 {} \;
nó sẽ là:
chmod 775 fileA
chmod 775 fileB
chmod 775 fileC
Theo man find:
Lệnh -exec {} + Biến thể của hành động -exec này chạy lệnh được chỉ định trên các tệp đã chọn, nhưng dòng lệnh được xây dựng bằng cách nối thêm mỗi tên tệp đã chọn ở cuối; tổng số lệnh gọi của lệnh sẽ ít hơn nhiều so với số lượng tệp được khớp. Dòng lệnh được xây dựng theo cách tương tự như xargs xây dựng các dòng lệnh của nó. Chỉ một trường hợp '{}' được cho phép trong lệnh. Lệnh được thực thi trong thư mục bắt đầu.
man find(1)rất chi tiết, dễ dàng được tìm thấy bởi bất cứ ai. Đừng lười biếng.