Tìm kiếm TẤT CẢ các tệp với ack


14

Làm cách nào tôi có thể tìm kiếm tất cả các tệp (bao gồm cả nhị phân) trong thư mục hiện tại với ackv2?

Tôi muốn làm tương tự như làm ack 'foo' **, nhưng chỉ với một cờ, vì vậy nó hoạt động nếu tôi muốn tìm kiếm tất cả các tệp trong một thư mục cụ thể mà không cần nối thêm **.


Sự khác biệt giữa ack 'foo'ack 'foo' **:

$ mkdir test && cd test
$ printf '\x00\x01foo1\x00' > test1
$ printf 'foo2' > test2
$ ack 'foo'
test2
1:foo2
$ ack 'foo' **
test1
1:foo1

test2
1:foo2

Tại sao bạn muốn sử dụng ack cho việc này thay vì grep?
Andy Lester

1
@AndyLester Tôi chỉ nghĩ rằng ackluôn luôn tốt hơn grep. Tôi đã sai :).
Tyilo

Câu trả lời:


6

Theo mặc định, Ack tìm kiếm một mẫu trong tất cả các tệp không nhị phân bên dưới thư mục hiện tại.

Tôi tin rằng các phiên bản Ack cũ hơn sẽ tìm kiếm thông qua các tệp nhị phân khi bạn chuyển cho chúng --binarycờ. Cờ này đã được gỡ bỏ mặc dù. Bạn có thể sử dụng grep thay thế.

grep -ar 'foo' .

Nó không có gì để làm với symlinks. Nó phải làm với các tệp nhị phân!
Tyilo

@Tyilo: Tôi đã sửa đổi câu trả lời của tôi.

13

Khi bạn chuyển không có tên tệp cho ack, nó sẽ hoạt động trên một tập tin mặc định tích hợp sẵn loại trừ các tệp nhị phân không được nhận dạng. Nếu bạn vượt qua tên tệp, nó sẽ tìm kiếm trong tất cả các tệp bạn vượt qua. Điều này giải thích sự khác biệt giữa ack fooack foo **.

ack 1

Trong ack 1.x, sử dụng cờ -ađể báo cho ack không bỏ qua các tệp có loại mà nó không nhận ra.

Bạn có thể tạo bí danh nếu bạn muốn cờ đó thường xuyên hơn không: thêm dòng alias ack='ack -a'trong ~/.bashrchoặc ~/.zshrc. Nếu bạn thiết lập bí danh này và muốn gọi ackmà không có tùy chọn, hãy gọi \ack(dấu gạch chéo ngược sẽ vô hiệu hóa mở rộng bí danh). Các kịch bản không bị ảnh hưởng bởi bí danh, chỉ có các vỏ tương tác.

Ngoài ra, bạn có thể thêm -atùy chọn cho ~/.ackrc.

Các trận đấu trong các tệp nhị phân sẽ được liệt kê dưới dạng tệp Binary test1 khớp với. Không có cách nào để vô hiệu hóa hành vi này mà không sửa đổi chính Ack (ít nhất là thêm một plugin).

ack 2

Trong ack 2.0, -atùy chọn đã bị xóa. Thay vào đó, những gì bạn có thể làm là xác định loại phù hợp với tất cả các tệp và sử dụng -ktùy chọn để tạo ack bao gồm tất cả các tệp thuộc loại đó. Lưu ý rằng các loại tệp được xử lý theo thứ tự không thể đoán trước, vì điều này sẽ khiến một tập hợp các loại nhị phân ngẫu nhiên được xử lý như bình thường thay vì như loại thông thường.

ack --type-set='all:match:.*' -k foo

Bằng cách này, các trận đấu được in ngay cả đối với các tệp trông khác đi. Như trên, bạn có thể thêm các tùy chọn này vào bí danh hoặc cho .ackrc.


1
Điều đó khá lén lút, @Gilles.
Andy Lester

@AndyLester, tại sao tùy chọn -a bị xóa? "Điều này là do" trong phần hoàn trả không thực sự giải thích lý do tại sao tôi không thể tìm kiếm các loại tệp không được nhận dạng nữa.
Yann Dìnendal

Bởi vì hành vi của 1.x, để tìm kiếm tất cả các tệp văn bản không được nhận dạng, giờ đây là mặc định trong 2.0.
Andy Lester

2
Thật kỳ lạ, tôi có một tệp js rút gọn mà thậm chí bộ kiểu kết hợp tất cả các loại đặc biệt đó không thể tìm thấy ...
Izkata

Tôi ở đây vì điều đó: một văn bản bên trong tệp js rút gọn, không được phân tích cú pháp bởi ack. Tôi nghĩ câu trả lời sẽ giống như "thêm -a" ... Tôi thất vọng.
Luciano Fantuzzi
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.