Tìm tập tin chứa chuỗi trong tên tệp và chuỗi khác nhau trong tập tin?


16

Tôi muốn (đệ quy) tìm tất cả các tệp có "ABC" trong tên tệp của chúng, cũng chứa "XYZ" trong tệp. Tôi đã thử:

find . -name "*ABC*" | grep -R 'XYZ'

nhưng nó không cho đầu ra chính xác.

Câu trả lời:


26

Đó là bởi vì grepkhông thể đọc tên tệp để tìm kiếm từ đầu vào tiêu chuẩn. Những gì bạn đang làm là in tên tập tin có chứa XYZ. Sử dụng find's -execlựa chọn thay vì:

find . -name "*ABC*" -exec grep -H 'XYZ' {} +

Từ man find:

   -exec command ;
          Execute  command;  true  if 0 status is returned.  All following
          arguments to find are taken to be arguments to the command until
          an  argument  consisting of `;' is encountered.  The string `{}'
          is replaced by the current file name being processed  everywhere
          it occurs in the arguments to the command, not just in arguments
          where it is alone, as in some versions of find. 

[...]

   -exec command {} +
          This  variant  of the -exec action runs the specified command on
          the selected files, but the command line is built  by  appending
          each  selected file name at the end; the total number of invoca‐
          tions of the command will  be  much  less  than  the  number  of
          matched  files.   The command line is built in much the same way
          that xargs builds its command lines.  Only one instance of  `{}'
          is  allowed  within the command.  The command is executed in the
          starting directory.

Nếu bạn không cần các dòng khớp thực tế mà chỉ có danh sách các tên tệp chứa ít nhất một lần xuất hiện của chuỗi, thay vào đó hãy sử dụng danh sách này:

find . -name "*ABC*" -exec grep -l 'XYZ' {} +

2

Tôi tìm lệnh sau đây theo cách đơn giản nhất:

grep -R --include="*ABC*" XYZ

hoặc thêm -ivào trường hợp tìm kiếm không nhạy cảm:

grep -i -R --include="*ABC*" XYZ

1

… | grep -R 'XYZ'không có ý nghĩa. Một mặt, -R 'XYZ'có nghĩa là hành động đệ quy trên XYZthư mục. Mặt khác, … | grep 'XYZ'có nghĩa là tìm kiếm mẫu XYZtrong grepđầu vào tiêu chuẩn của. \

Trên Mac OS X hoặc BSD, grepsẽ coi XYZlà một mẫu và phàn nàn:

$ echo XYZ | grep -R 'XYZ'
grep: warning: recursive search of stdin
(standard input):XYZ

GNU grepsẽ không phàn nàn. Thay vào đó, nó xử lý XYZnhư một mẫu, bỏ qua đầu vào tiêu chuẩn của nó và tìm kiếm đệ quy bắt đầu từ thư mục hiện tại.


Những gì bạn muốn làm có lẽ là

find . -name "*ABC*" | xargs grep -l 'XYZ'

Sồi tương tự như

grep -l 'XYZ' $(find . -name "*ABC*")

Cả hai đều nói grepđể tìm kiếm XYZtrong tên tập tin phù hợp.

Tuy nhiên, lưu ý rằng bất kỳ khoảng trắng nào trong tên tệp sẽ khiến hai lệnh đó bị hỏng. Bạn có thể sử dụng xargsmột cách an toàn bằng cách sử dụng NULlàm dấu phân cách:

find . -name "*ABC*" -print0 | xargs -0 grep -l 'XYZ'

Nhưng giải pháp của @ terdon sử dụng find … -exec grep -l 'XYZ' '{}' +đơn giản và tốt hơn.


-1

Cam kết Linux: ll -iR | grep "tên tệp"

ví dụ: Bookname.txt sau đó sử dụng ll -iR | grep "Tên sách" hoặc ll -iR | grep "tên" hoặc ll -iR | grep "Sách"

chúng ta có thể tìm kiếm với một phần của tên tập tin.

Điều này sẽ liệt kê tất cả các tên tệp phù hợp từ các thư mục hiện tại và phụ


Đây chỉ là một câu trả lời một phần vì nó không bao giờ giải quyết phần "tìm kiếm bên trong tệp" của câu hỏi. Nó cũng hiệu quả hơn nhiều khi sử dụng các mẫu hình cầu tên, có thể kết hợp với findnhư trong một số câu trả lời khác.
Kusalananda
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.