Лучший 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
, оптимизированный для работы с деревьями исходного кода.