Làm cách nào tôi có thể tìm thấy tất cả các tệp KHÔNG chứa chuỗi văn bản?


40

Tôi có thể sử dụng lệnh ngắn gọn nào để tìm tất cả các tệp KHÔNG chứa chuỗi văn bản?

Tôi đã thử điều này (sử dụng -v để đảo ngược các tham số của grep) mà không gặp may:

find . -exec grep -v -l shared.php {} \;

Ai đó nói điều này sẽ làm việc:

find . ! -exec grep -l shared.php {} \;

Nhưng nó dường như không làm việc cho tôi.

Trang này có ví dụ này:

find ./logs -size +1c  > t._tmp
while read filename
do
     grep -q "Process Complete" $filename
     if [ $? -ne 0 ] ; then
             echo $filename
     fi
done < t._tmp
rm -f t_tmp

Nhưng đó là cồng kềnh và hoàn toàn không súc tích.

ps: Tôi biết điều đó grep -L *sẽ làm điều này, nhưng làm thế nào tôi có thể sử dụng lệnh find kết hợp với grep để loại trừ các tệp là những gì tôi thực sự muốn biết.

pss: Ngoài ra tôi không chắc chắn làm thế nào để có grep bao gồm các thư mục con với grep -L *cú pháp, nhưng tôi vẫn muốn biết cách sử dụng nó với find:)


1
Lệnh đầu tiên bạn viết hoạt động tốt trên máy tính của tôi. Phiên bản tìm kiếm nào bạn đang sử dụng? Và vì chúng tôi đang ở đó, có thể chỉ định unix nào bạn đang chạy ..
rahmu

@rahmu, lệnh này hầu như không hoạt động như bạn mong đợi. Bạn có thể đã có một trường hợp rất cụ thể. Vui lòng xem unix.stackexchange.com/questions/339619/ từ
sgnsajgon

Câu trả lời:


8
find . -type f | xargs grep -H -c 'shared.php' | grep 0$ | cut -d':' -f1    

HOẶC LÀ

find . -type f -exec grep -H -c 'shared.php' {} \; | grep 0$ | cut -d':' -f1

Ở đây chúng tôi đang tính toán số dòng phù hợp (sử dụng -c) trong một tệp nếu số đếm bằng 0 thì đó là tệp bắt buộc, vì vậy chúng tôi đã cắt cột đầu tiên tức là tên tệp từ đầu ra.


6
Điều này là vô cùng phức tạp. Xem câu trả lời của Kevin .
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles vâng tôi đồng ý với bạn. Tôi có +1 câu trả lời của anh ấy.
Sachin Divekar

6
Điều này không chỉ "cực kỳ phức tạp" mà còn sai vì nó cũng sẽ liệt kê tất cả các tệp chứa bội số của 10 dòng khớp với mẫu. Ngay cả khi grepđã được sửa, điều này vẫn sẽ cho rằng không có tên tệp nào chứa :hoặc tự dòng mới ...
don_crissti

@don_crissti, cảm ơn đã đề cập! Tuy nhiên, trừ khi bạn sử dụng nhiều mã sao chép-dán, giải pháp ở trên là một mánh lới quảng cáo rất hay.
Ufos

@Ufos - Tôi thực sự không nhận được bình luận của bạn ... Điều này là sai . Dù sao, hãy thoải mái sử dụng nó nếu nó trông giống như một "mánh lới quảng cáo thực sự tốt đẹp" đối với bạn ...
don_crissti

56

Tìm kiếm của bạn sẽ hoạt động nếu bạn thay đổi -v -l(các tệp có bất kỳ dòng nào không khớp) thành -L(các tệp không có dòng nào khớp), nhưng bạn cũng có thể sử dụng tùy chọn grepđệ quy ( -r):

grep -rL shared.php .

Tìm nào nên làm việc?
cwd

@Kevin - xin lỗi, find . -exec grep -v -l shared.php {} \;(và tất cả các biến thể khác tôi đã thử) không hoạt động với tôi. Tôi đang dùng OS X nhưng tôi không nghĩ điều đó quan trọng. Tôi đã cho bạn +1 vì tôi đã quên -rtùy chọn này.
cwd

@cwd Tôi biết cái này đã cũ nhưng tôi muốn để nó ở đây cho những độc giả tương lai: thực tế là bạn đang dùng OS X sẽ tạo ra sự khác biệt. Mac OSX sử dụng các lệnh FreeBSD. Hầu hết mọi người ở đây giả định các lệnh kiểu Linux (GNU). Họ có lập luận khác nhau, cách xử lý chi tiết khác nhau.
Rich Homolka

Kể từ năm 2016, OSX dường như hỗ trợ-L
David Moles

@kevin Tôi nói rồi, không phải thế đâu. :) không phải ai cũng nói rõ ràng là không, nhưng các ý kiến ​​đều khó hiểu (và tôi chắc chắn đã gặp phải các vấn đề khác về OS X / BSD so với GNU).
David Moles

4

Tôi biết điều đó grep -L *sẽ làm điều này, nhưng làm thế nào tôi có thể sử dụng findlệnh kết hợp với grepđể loại trừ các tệp là những gì tôi thực sự muốn biết

Bạn có thể sử dụng findgrepthích điều này:

find . -type f ! -exec grep -q 'PATTERN' {} \; -print

Ở đây chỉ -printđược thực hiện nếu biểu thức trước: ! -exec ... {}đánh giá là true.
Vì vậy, đối với mỗi tệp được tìm thấy, grep -q 'PATTERN'được sử dụng exec, nếu kết quả là falsethì toàn bộ biểu thức sẽ ! -exec grep -q 'PATTERN'đánh giá truevà tên tệp là printed.


2
Đó là một lợi ích của tiêu chuẩn và di động.
Stéphane Chazelas

Có một sự khác biệt với GNU grep -Lmặc dù nó cũng sẽ bao gồm các tệp không thể đọc được trong danh sách.
Stéphane Chazelas

1

Bạn thấy kết quả không khớp với tùy chọn -L

grep -iL shared.php .

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.