Tôi đang cố chạy lệnh sau:
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' +
Điều này đang trả về một lỗi:
find: missing argument to -exec
Tôi không thể thấy có gì sai với lệnh này, vì nó dường như khớp với trang man:
lệnh -exec {} +
Biến thể này của tùy chọn -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 nối thêm từng tên tệp đã chọn ở cuối; tổng số lượng yêu cầu 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.
Tôi cũng đã thử:
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar {} +
find a/folder b/folder -name *.c -o -name *.h -exec 'grep -I foobar' {} +
find a/folder b/folder -name *.c -o -name *.h -exec 'grep -I foobar' '{}' +
find a/folder b/folder -name "*.c" -o -name "*.h" -exec grep -I foobar '{}' +
find a/folder b/folder \( -name *.c -o -name *.h \) -exec grep -I foobar '{}' +
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+
find
. Mặc dù -exec cmd {} +
biến thể là POSIX và đã có sẵn từ những năm 80, GNU tìm thấy chỉ thêm nó (tương đối) gần đây (2005). Điều gì find --version
nói với bạn?
-exec {} +
đã được thêm vào 4.2.12 vào năm 2005. Trong các phát hiện GNU cũ hơn, bạn có thể sử dụng (không phải POSIX) -print0 | xargs -r0
để có được thứ gì đó tương tự. 4.1
là từ năm 1994.
-name
đối số mẫu nên được trích dẫn : -name "*.c" -o -name "*.h"
. Điều này là đúng, mặc dù nó không liên quan đến -exec
lỗi. Bạn sẽ nhận thấy rằng tất cả các câu trả lời khác đều đặt các ký tự đại diện vào dấu ngoặc kép, mặc dù chỉ Gilles đề cập đến nó. Tiết (Cont'd)
-name "*.[ch]"
mà không cần giải thích. Điều này có lợi ích của việc đơn giản hóa dòng lệnh và đặc biệt là loại bỏ -o
. Tìm biểu thức liên quan -o
là khó để có được đúng. Bạn sai rồi; nếu lệnh của bạn được sửa để nó không bị lỗi (như trong câu trả lời của Gilles), nó sẽ grep
chỉ chạy trên các .h
tệp. Bạn cần phải làm '(' -name '*.c' -o -name '*.h' ')'
.
+
cuối?find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+