Sự khác biệt giữa việc sử dụng '+' (cộng) và ';' (dấu chấm phẩy) trong lệnh -exec?


28

Tôi đang tự hỏi để biết rằng sự khác biệt giữa việc sử dụng +;ở cuối -execlệnh khi tôi sử dụng trong findlệnh là gì?

find .... -exec ... \; 

VS

find .... -exec ... + 

Câu trả lời:


36

-exec ... \;sẽ chạy hết mục này đến mục khác. Vì vậy, nếu bạn có ba tệp, dòng exec sẽ chạy ba lần.

-exec ... {} +là các lệnh có thể mất nhiều hơn một tập tin tại một thời điểm (ví dụ như cat, stat, ls). Các tập tin được tìm thấy findđược nối lại với nhau như một xargslệnh. Điều này có nghĩa là ít bị loại bỏ và cho các hoạt động nhỏ, có thể có nghĩa là tăng tốc đáng kể.

Đây là một bản demo hiệu suất trích dẫn 10.000 tập tin trống.

$ mkdir testdir
$ touch testdir/{0000..9999}

$ time find testdir/ -type f -exec cat {} \;
real    0m8.622s
user    0m0.452s
sys     0m8.288s

$ time find testdir/ -type f -exec cat {} +
real    0m0.052s
user    0m0.015s
sys     0m0.037s

Một lần nữa, điều này chỉ hoạt động trên các lệnh có thể mất nhiều tên tệp. Bạn có thể tìm ra nếu lệnh của bạn giống như vậy bằng cách xem trang chủ của nó. Đây là tóm tắt từ man cat:

SYNOPSIS
       cat [OPTION]... [FILE]...

Dấu chấm lửng trên [FILE]...có nghĩa là nó có thể mất nhiều hơn một tệp.

+chỉ có thể được sử dụng trên các lệnh đơn và bạn phải có chính xác một lệnh {}trong dòng. \;có thể hoạt động với nhiều nhóm từ 0 đến nhiều.


4
Ví dụ: với \;, lệnh thực thi sẽ là cat 1; cat 2; cat 3. Với +, lệnh thực thi sẽ là cat 1 2 3.
Alaa Ali

AFAIK, +không phải là POSIX, vì vậy có thể không có sẵn trên các hệ thống không phải là Linux. Không phải là một mối quan tâm nếu bạn không bao giờ rời khỏi nền tảng, nhưng tốt để biết nếu bạn đã từng phải sử dụng Solaris. :)
Simon Richter

Oh tốt đẹp, cảm ơn cho thông tin. Tôi thường -exec <command> {} ';'bởi vì việc đánh máy của tôi dễ dàng hơn (tôi có thể chạm vào loại nhưng tôi không thực sự có kỹ thuật tốt nhất).
hanetzer

2
@SimonRichter: Không, -exec ... {} +là POSIX. Xem: pubs.opengroup.org/onlinepub/9699919799/utilities/iêu
cuonglm

@SimonRichter -exec ... {} +Tiện ích mở rộng đã được đề xuất để đưa vào thông số kỹ thuật POSIX vào năm 2001 và được phê chuẩn thành vấn đề POSIX 6 năm 2004. Có thể phiên bản Solaris mà bạn đã sử dụng cũ hơn tiêu chuẩn POSIX (hoặc chỉ nhắm mục tiêu phiên bản cũ hơn).
Oli
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.