Ý nghĩa của {} + trong lệnh find -exec là gì?


23

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à {} +{} \;. 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 {} \;

5
Nó được mô tả 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.
Miroslav Koškár

Cảm ơn Miroslav thân mến, tôi đã tìm kiếm trong man exec!

Ah, tôi chưa bao giờ đi qua việc {} +sử dụng trước đây. Tôi thường sử dụng xargs cho điều đó (và thường xuyên find ... -print0 | xargs -0 ...)

Câu trả lời:


27

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:


một sự khác biệt và một lớn. Xem câu trả lời của người dùng 1116056
Jahid

24

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

5

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.