2011-10-08 29 views
23

Sử dụng ack (đôi khi được đóng gói như ack-grep) Tôi biết rằng tôi có thể tìm đường có chứa một chuỗi cụ thể bằng cách thực hiện:
ack -g somestringChỉ có thể tìm tệp dựa trên tên tệp không?

Nhưng nếu tôi chỉ muốn tập tin mà có "someString" trong họ tên tệp?

Trả lời

20

Bạn có thể sử dụng tiện ích find. Một cái gì đó như thế này:

find /path/to/look/in -name '*somestring*' -print 

Trên một số hệ thống, nếu bạn bỏ qua đường dẫn, thư mục hiện tại được sử dụng. Trên các hệ thống khác, bạn không thể bỏ qua nó, chỉ cần sử dụng . cho thư mục hiện tại.

Ngoài ra, hãy đọc man find cho nhiều tùy chọn khác.

+1

Đây là câu trả lời. Trừ khi bạn đang sử dụng các tính năng phát hiện filetype của ack, 'find' là con đường để đi. –

-2

tác phẩm này dành cho tôi, ack -all "somestring" trong đó ack --all "somestring" sẽ tìm kiếm tất cả các tệp có chứa chuỗi đó. ack "somestring" sẽ chỉ tìm kiếm các tệp có chuỗi đó. nếu bạn muốn thêm một số loại tệp để tìm kiếm vĩnh viễn như các tệp ruby ​​hoặc bạn có thể tạo tệp .ackrc trong thư mục chính của mình, hãy thêm dòng fallowing --type-add = ruby ​​= .haml, .rake, .rsel. Josh

+0

Điều này dường như tìm kiếm nội dung tập tin. Đó không phải là câu hỏi được yêu cầu. – isherwood

40

Tôi đồng ý tìm là con đường để đi, nhưng bạn cũng có thể dễ dàng làm điều đó với ack:

ack -f | ack "string" 

Ở đây, "ack -f" đệ quy liệt kê tất cả các tập tin nó sẽ tìm kiếm; đường dẫn đến lệnh lệnh thứ hai để tìm kiếm thông qua đó. ack -f không có lợi thế là bỏ qua các tệp nhị phân và thư mục mà không cần thêm bất kỳ đối số nào; thường thì lệnh "tìm" có thể được thay thế bằng lệnh "ack" ngắn hơn nhiều.

+0

Tìm nhanh hơn. – sloven

+0

ack -f | rg "chuỗi" – arpit

0

Tôi chưa thể nhận xét hoặc nếu không tôi sẽ thêm câu trả lời này vào câu trả lời của @ dmedvinsky ở trên. Bạn có thể muốn kết hợp cách tiếp cận của mình với @ Whaley của answer to a different question để lọc ra .svn file:

find /path/to/look/in -not -iwholename '*.svn*' -name '*somestring*' -print 
3

Nếu bạn muốn sử dụng ack để tìm tất cả các file có somestring trong basename của họ, chỉ cần thêm [^/]*$ để regex, ví dụ:

ack -g somestring[^/]*$ 

Thật không may, --color sẽ hiển thị các trận đấu từ somestring đến cuối tên tập tin; nhưng bạn có thể làm những gì bạn yêu cầu để sử dụng ack.

Các vấn đề liên quan