ack: исключить только один каталог, но оставить все остальные с тем же именем

Моя структура папок выглядит так:

/app
/app/data
...
/app/secondary
/app/secondary/data

Я хочу рекурсивно искать /app, включая /app/data. Однако я не хочу искать /app/secondary/data. Это то, что у меня есть до сих пор:

ack --ignore-dir=data searchtext
ack --ignore-dir=secondary/data searchtext

Первая команда игнорирует оба каталога, а вторая не игнорирует ни один из них. Как должна выглядеть моя команда ack из папки приложения?


ack
person mattalxndr    schedule 09.05.2010    source источник


Ответы (2)


Этот ответ относится к версиям Ack до 2, см. этот ответ для версий Ack >=2.< /сильный>

Первый игнорирует оба, потому что у них обоих есть «данные» в качестве подкаталога, и ack ищет подкаталоги по умолчанию. Таким образом, он будет игнорировать любой подкаталог с таким именем. К сожалению, ваш второй способ тоже не работает. Это работает для меня:

ack -a searchtext -G '^(?!.*secondary/data.*).*$'

Вместо -a для поиска всех файлов см. ack-grep --help=types для поиска только определенных типов файлов, например --type=text

person rkulla    schedule 09.05.2010
comment
Спасибо за ответ. Я получаю следующее: $ ack-grep --text -G '^(?!.*secondary/data.*).*$' ack-grep: Регулярное выражение не найдено. - person mattalxndr; 10.05.2010
comment
это потому, что вы забыли указать шаблон, который вы ищете, например, «текст поиска» - person rkulla; 10.05.2010
comment
Для получения информации о том, как поместить этот параметр -G в файл ~/.ackrc, см.: stackoverflow.com/questions/5425363/ - person Greg Hewgill; 25.03.2011
comment
как нам попросить ack сделать это навсегда, например в .ackrc файле? - person nyxee; 24.07.2017

Более старые версии ack могут принимать только имя папки, а не путь к ней. Начиная с версии 1.93_02, они добавили эту возможность в:

1.93_02     Wed Oct  6 21:39:58 CDT 2010
   [ENHANCEMENTS]
   The --ignore-dir option now can ignore entire paths relative
   to your current directory.  Thanks to Nick Hooey.  For example:

       ack --ignore-dir=t/subsystem/test-data

(из betterthangrep.com/Changes)

Вы можете проверить, какая у вас версия, с помощью --version:

ack --version
person Erin Heyming    schedule 07.02.2012