Искать ВСЕ файлы с помощью ack


14

Как я могу найти все файлы (включая двоичные) в текущем каталоге с ackv2?

Я хочу сделать то же самое, что и делать ack 'foo' **, но только с флагом, поэтому он работает, если я хочу искать все файлы в определенном каталоге без добавления **.


Разница между 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

Почему вы хотите использовать ack вместо grep?
Энди Лестер

1
@AndyLester Я просто подумал, что ackвсегда лучше, чем grep. Я ошибался :).
Tyilo

Ответы:


6

По умолчанию Ack ищет шаблон во всех недвоичных файлах ниже текущего каталога.

Я считаю, что старые версии Ack будут искать в двоичных файлах, когда вы передаете им --binaryфлаг. Этот флаг был удален, хотя. Вы можете использовать вместо этого grep.

grep -ar 'foo' .

Это не имеет ничего общего с символическими ссылками. Это связано с двоичными файлами!
Tyilo

@Tyilo: я изменил свой ответ.

13

Когда вы не передаете имя файла в ack, он работает со встроенным набором файлов по умолчанию, который исключает нераспознанные двоичные файлы. Если вы передаете имена файлов, он ищет все файлы, которые вы передаете. Это объясняет разницу между ack fooи ack foo **.

кв 1

В ack 1.x используйте флаг, -aчтобы ack не пропускал файлы, тип которых он не распознает.

Вы можете сделать псевдоним, если вы хотите, чтобы этот флаг чаще, чем нет: добавьте строку alias ack='ack -a'в ваш ~/.bashrcили ~/.zshrc. Если вы установили этот псевдоним и хотите позвонить ackбез опции, вызовите \ack(обратная косая черта отключает расширение псевдонима). На псевдонимы скрипты не влияют, только интерактивные оболочки.

Кроме того, вы можете добавить -aопцию к вашему ~/.ackrc.

Совпадения в двоичных файлах будут перечислены как «совпадения двоичного файла test1». Нет способа отключить это поведение без изменения самого Ack (по крайней мере, добавления плагина).

кв 2

В ack 2.0 -aопция была удалена. Вместо этого вы можете определить тип, соответствующий всем файлам, и использовать -kопцию, чтобы ack включал все файлы этого типа. Обратите внимание, что типы файлов обрабатываются в непредсказуемом порядке, поэтому случайный набор двоичных типов будет обрабатываться как обычный, а не как обычный тип.

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

Таким образом, совпадения печатаются даже для файлов, которые в противном случае выглядели бы двоичными. Как и выше, вы можете добавить эти параметры к псевдониму или вашему .ackrc.


1
Это довольно подлый, @Gilles.
Энди Лестер

@AndyLester, почему была удалена опция -a? «Это потому что» в ответе не объясняет, почему я больше не могу искать нераспознанные типы файлов.
Янн Динендал

Поскольку поведение 1.x для всех нераспознанных текстовых файлов теперь используется по умолчанию в 2.0.
Энди Лестер

2
Странно, у меня есть сжатый js-файл, который не может найти даже этот специальный набор типов соответствия всем типам ...
Izkata

Я здесь из-за этого: текст внутри уменьшенного файла js, который не анализируется ack. Я думал, что ответ будет как «добавить -a» ... Я разочарован.
Лучано
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.