Tôi muốn tìm các tệp trong thư mục hiện tại có chứa văn bản "chrome".
$ find . -exec grep chrome
find: missing argument to `-exec'
Tôi đang làm gì sai?
find: Only one instance of {} is supported with -exec ... +
                -execvớifind
                Tôi muốn tìm các tệp trong thư mục hiện tại có chứa văn bản "chrome".
$ find . -exec grep chrome
find: missing argument to `-exec'
Tôi đang làm gì sai?
find: Only one instance of {} is supported with -exec ... +
                -execvớifind
                Câu trả lời:
Bạn đã bỏ lỡ một ;(thoát ở đây \;để ngăn vỏ giải thích nó) hoặc a +và a {}:
find . -exec grep chrome {} \;
hoặc là
find . -exec grep chrome {} +
findsẽ thực thi grepvà sẽ thay thế {}bằng (các) tên tệp được tìm thấy. Sự khác biệt giữa ;và +là với ;một greplệnh duy nhất cho mỗi tệp được thực thi trong khi với +càng nhiều tệp càng tốt sẽ được cung cấp làm tham số grepcùng một lúc.
grep -lsbên trong cấu trúc find.
                    find . -exec grep foo {} +sẽ hiển thị cho bạn đầu ra như thế này./dir/file.py:from foo import bar
                    find . -exec grep foo {} \;sẽ hiển thị cho bạn đầu ra như thế nàyfrom foo import bar
                    find . -exec grep -l foo {} +sẽ hiển thị cho bạn đầu ra như thế này./dir/file.py
                    find . -exec grep -l foo {} \;sẽ hiển thị cho bạn đầu ra như thế này./dir/file.py
                    Bạn không cần phải sử dụng findcho việc này cả; grep có thể xử lý việc mở các tệp từ danh sách toàn cầu của mọi thứ trong thư mục hiện tại:
grep chrome *
... hoặc thậm chí đệ quy cho thư mục và mọi thứ trong đó:
grep chrome . -R
              findkhi grepcó thể thực hiện công việc, nhưng trong một số trường hợp, sẽ hiệu quả hơn khi sử dụng find để tinh chỉnh danh sách tệp trước khi ra ngoài để grep.
                    grepkhông bị sặc trong trường hợp execnhư vậy.
                    find . | xargs grep 'chrome'
bạn cũng có thể làm:
find . | xargs grep 'chrome' -ls
Cái đầu tiên cho bạn thấy các dòng trong các tập tin, thứ hai chỉ liệt kê các tập tin.
Tùy chọn của Caleb gọn gàng hơn, ít tổ hợp phím hơn.
xargslà nó hy vọng đầu vào của nó sẽ được trích dẫn theo một cách đặc biệt mà findkhông sản xuất. Vì vậy, find … | xargs …không hoạt động nếu bạn có tên tệp chứa khoảng trắng hoặc \'".
                    find . | xargs -n1 -iX grep "X" 'chrome'vậy để các đối số được đưa ra cùng một lúc và được trích dẫn. Rõ ràng đây là một cách không hiệu quả khủng khiếp để xử lý ví dụ này, nhưng đối với một số tình huống thì thật tuyệt.
                    xargsđối phó với tên tệp Linux là find ... -print0 | xargs -0sử dụng NUL làm dấu phân tách. Thay thế - xargs -d '\n'sử dụng dòng mới làm dấu phân tách, độ tin cậy 99%.
                    Tìm là một cách và bạn có thể thử the_silver_searchersau đó tất cả những gì bạn cần làm là
ag chrome
Nó sẽ tìm kiếm chrome trong tất cả các tệp (bao gồm các thư mục phụ) và nó nhanh hơn tìm thấy
Để xem danh sách các tập tin thay vì dòng:
grep -l "chrome" *
hoặc là:
grep -r -l "chrome" .
              Đây là một ví dụ về cách tôi thường sử dụng find / exec ...
find  . -name "*.py" -print -exec fgrep hello {} \;
Tìm kiếm này đệ quy cho tất cả các tệp .py và cho mỗi tệp in ra tên tệp và fgrep 'cho' xin chào 'trên tệp đó (cho mỗi tệp). Đầu ra trông giống như (vừa chạy một ngày hôm nay):
./r1.py
./cgi-bin/tst1.py
print "hello"
./app/__init__.py
./app/views.py
./app/flask1.py
./run.py
./tst2.py
print "hello again"
              find . -name "*.py" -exec fgrep -l hello {} \;  - nó sẽ in tên tệp của các tệp trùng khớp và không có gì khác