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.
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:
Đó là bởi vì grep
khô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 -exec
lự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' {} +
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 -i
vào trường hợp tìm kiếm không nhạy cảm:
grep -i -R --include="*ABC*" XYZ
… | grep -R 'XYZ'
không có ý nghĩa. Một mặt, -R 'XYZ'
có nghĩa là hành động đệ quy trên XYZ
thư mục. Mặt khác, … | grep 'XYZ'
có nghĩa là tìm kiếm mẫu XYZ
trong grep
đầu vào tiêu chuẩn của. \
Trên Mac OS X hoặc BSD, grep
sẽ coi XYZ
là một mẫu và phàn nàn:
$ echo XYZ | grep -R 'XYZ'
grep: warning: recursive search of stdin
(standard input):XYZ
GNU grep
sẽ không phàn nàn. Thay vào đó, nó xử lý XYZ
như 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 XYZ
trong 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 xargs
mộ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.
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ụ
find
như trong một số câu trả lời khác.