Làm thế nào để xóa grep nghiêm trọng cho một tên tệp thay vì nội dung của một tập tin?


133

grep được sử dụng để tìm kiếm trong một tệp để xem liệu có dòng nào khớp với biểu thức chính quy định không. Tuy nhiên, tôi có tình huống này - tôi muốn viết một biểu thức chính quy sẽ khớp với tên tệp của chính nó (chứ không phải nội dung của tệp). Tôi sẽ chạy nó từ thư mục gốc của hệ thống, để tìm tất cả các tệp khớp với biểu thức chính quy.

Ví dụ: nếu tôi muốn tìm tất cả các tệp biểu mẫu VB bắt đầu bằng "f" và kết thúc bằng .frm, tôi sẽ sử dụng biểu thức chính quy -

   "f[[:alnum:]]*\.frm"

Grep có thể làm điều này? Nếu không, có một tiện ích sẽ cho phép tôi làm điều này? Cảm ơn.

Câu trả lời:


119

Bạn cần sử dụng findthay vì greptrong trường hợp này.

Bạn cũng có thể sử dụng findkết hợp với grephoặc egrep:

$ find | grep "f[[:alnum:]]\.frm"

12
Điều này là không cần thiết. Find có chức năng tích hợp sẵn với -regextùy chọn.
theo đó

4
Ở đây không cần thiết, nhưng grep hỗ trợ perl regex trong khi find thì không.
Dan

2
Không, bạn có thể sử dụng grep. Cách dễ dàng hơn sử dụng find. Thêm khóa chuyển "-rl" và nó sẽ tìm kiếm tên tệp thay vì tệp. Xem bài viết của tôi dưới đây.
RM

@ alpha_989, tôi đã nói grep hỗ trợ nó, nó thực hiện: gnu.org/software/grep/manual/html_node/ điểm điểm là đường ống đến grep chỉ cần thiết nếu bạn cần pcre. trong đó có câu trả lời đúng
Dan

60

Thí dụ

find <path> -name *FileName*

Từ hướng dẫn:

tìm mẫu tên

Cơ sở của tên tệp (đường dẫn với các thư mục hàng đầu bị xóa) khớp với mẫu mẫu vỏ. Vì các thư mục hàng đầu bị xóa, các tên tệp được xem là trùng khớp với -name sẽ không bao giờ bao gồm dấu gạch chéo, vì vậy "-name a / b" sẽ không bao giờ khớp với bất cứ thứ gì (thay vào đó bạn có thể cần sử dụng -path). Các siêu ký tự ("*", "?" Và "[]") khớp với "." ở đầu tên cơ sở (đây là một thay đổi trong find‐ utils-4.2.2; xem phần TIÊU CHUẨN TIÊU CHUẨN bên dưới). Để bỏ qua một thư mục và các tệp trong đó, sử dụng -prune; xem một ví dụ trong mô tả của -path. Niềng răng không được công nhận là đặc biệt, mặc dù thực tế là một số vỏ bao gồm Bash niềng răng có ý nghĩa đặc biệt trong các mẫu vỏ. Việc khớp tên tệp được thực hiện với việc sử dụng hàm thư viện fnmatch (3). Đừng quên đính kèm mẫu trong dấu ngoặc kép để bảo vệ nó khỏi sự mở rộng của vỏ.


2
Tôi thấy câu trả lời này là hữu ích nhất. Tôi đã thêm một vài tùy chọn bổ sung: find . -maxdepth 1 -name "*filename*" -print
JSON C11

47

Như Pablo đã nói, bạn cần sử dụng findthay vì grep, nhưng không cần phải sử finddụng grep. findcó chức năng đó được xây dựng trong:

find . -regex 'f[[:alnum:]]\.frm'

findlà một chương trình rất mạnh để tìm kiếm tệp theo tên và hỗ trợ tìm kiếm theo loại tệp, giới hạn độ sâu, kết hợp các thuật ngữ tìm kiếm khác nhau với các thao tác boolean và thực hiện các lệnh tùy ý trên các tệp tìm thấy. Xem trang tìm người để biết thêm thông tin.


1
Tôi sẽ thêm tính năng tìm kiếm rất hữu ích để tìm kiếm theo ngày -mtime-mmin
Johnride

1
Ngoài ra, chuyển đổi -regex thực hiện khớp với toàn bộ đường dẫn. Vì vậy, để làm việc, ví dụ cần thêm. * Ở đầu regex.
tumasgiu

15

Bạn có thể tìm đường dẫn đầy đủ của tệp bằng grep, chỉ cần đặt đầu ra của cây

tree -f | grep filename

Đây là một chức năng bạn có thể đưa vào .bash_profile hoặc .bashrc của bạn

findfile(){ tree -f | grep $1; } # $1 = filename, -f is full path

-f là tùy chọn.
jasonleonhard

10
find -iname "file_name"

Syntax :-
find -type type_descriptor file_name_here

loại type_descriptor: -

f: tập tin thông thường

d: thư mục

l: liên kết tượng trưng

c: thiết bị nhân vật

b: thiết bị khối


1
Tôi dường như không thể sử dụng một tên tệp theo sau -type typedescriptormột mình. Đây có phải là một sai lầm?
Allan Nørgaard

5

Bạn cũng có thể làm:

tree | grep filename

Điều này dẫn đầu ra của lệnh cây để grep tìm kiếm. Điều này sẽ chỉ cho bạn biết liệu các tập tin tồn tại mặc dù.


1

Không, grep chỉ hoạt động tốt cho việc này:

 grep -rl "filename" [starting point]

 grep -rL "not in filename"

1
Điều này tìm kiếm nội dung tệp cho "tên tệp", sau đó in tên của các tệp có khớp. OP muốn khớp tên tệp, không phải nội dung tệp.
Matthew

1
Đồng ý, điều này không tìm kiếm tên tệp, nó chỉ in tên của tên tệp mà nội dung tìm thấy phù hợp. Bạn đã hiểu nhầm cả -l-Ltùy chọn đáng kể.
Prometheus

2
+1 cho chính xác những gì tôi cần. Hạnh phúc vì tôi đã không phải chỉ trích câu hỏi để tìm câu trả lời tôi cần
Alexander McN Khoa

-1

Ngoài ra đối với nhiều tập tin.

tree /path/to/directory/ | grep -i "file1 \| file2 \| file3"

-1

Cách dễ nhất là

find . | grep test

ở đây find sẽ liệt kê tất cả các tệp trong thư mục hiện tại (.), theo cách đệ quy. Và sau đó nó chỉ là một grep đơn giản. tất cả các tệp có tên "kiểm tra" sẽ xuất hiện.

bạn có thể chơi với grep theo yêu cầu của bạn. Lưu ý: Vì grep là phân loại chuỗi chung, nó có thể dẫn đến việc cung cấp cho bạn không chỉ tên tệp. nhưng nếu một đường dẫn có một thư mục ('/xyz_test_123/other.txt') cũng sẽ đi đến tập kết quả. chúc mừng


Điều này sẽ tìm thấy bất cứ điều gì với "thử nghiệm" trong đường dẫn, ví dụ ./foo/bar/latest/fred.txt.
Paul R

Oh. Đó là điều tôi không nghĩ tới. Cảm ơn bạn đã đề cập.
sachyy
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.