Лучший GNU найти замену

Я ищу лучшую находку. Причина в том, что пользовательский интерфейс find не интуитивен для меня (в частности, стиль обрезки / печати) и его трудно заключить в функцию из-за строгих требований к порядку аргументов. locate / updatedb недостаточно гибок для использования. Кто-нибудь захочет поделиться своим примером, найти обертки или найти альтернативы (только для командной строки, пожалуйста)?

Вот пример того, что я считаю неинтуитивным использованием:

find dir_a dir_b \( -path dir_a/.git -o -path dir_b/out \) -prune -o \( -type f -o -type l \)

Указывать каталоги перед опциями странно для меня, а синтаксис обрезки легко забывается. (Некоторые программы вместо этого используют опцию --exclude.) Я понимаю, что это придирчивый момент.

Вот моя лучшая попытка указать некоторые значения по умолчанию без потери функциональности:

f()
{
  # The trouble is that -regextype must appear after path but before expression.
  # HACK: "-D debugopts" unsupported and -[HLPO] options assumed to before dirs.
  local a=()
  while [[ -n "$1" ]] && ( [[ ! "${1:0:1}" =~ [-!(),] ]] || [[ "${1:0:2}" =~ -[HLPO] ]] )
  do
    a+=("$1")

    # Eliminate arg from @.
    shift
  done

  find -O3 "${a[@]}" -nowarn -regextype egrep "$@"
}

Кажется глупым требовать идеального понимания всех параметров в программе, чтобы иметь возможность обернуть его с некоторыми значениями по умолчанию и не потерять функциональность / совместимость с обычным поиском.

Я предполагаю, что ничего стандартного, как в GNU, не найду, но может быть что-то лучше, хотя и менее известное.

Обновление (2013-11-26):

  • По предложению Итая я использовал ack около года. Это работает очень хорошо для по крайней мере 95% моих поисков.
  • Я недавно обнаружил Ag, который является быстрой версией ACK. Это работало хорошо в течение последних нескольких недель.

Обновление (2014-11-23):

Я очень рекомендую Ag. Работает отлично. Еще много раз нужно найти Find и для этого я продолжаю искать хорошую замену. Хотя интерфейс Find, безусловно, полезен, он устарел и, на мой взгляд, излишне сложен.

Обновление (2017-08-04):

Сейчас я очень рекомендую ripgrep в качестве незаменимой замены Ag. Это очень новый инструмент, но его поддержка файлов.gitignore значительно превосходит Ag, а во всех остальных отношениях он эквивалентен или лучше. Я продолжаю искать замену Найти.

1 ответ

Решение

Вы должны попробовать Ack, который является заменой для обоих find а также grep, оптимизированный для работы с деревьями исходного кода.

Другие вопросы по тегам