2012-05-25 2 views
3

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

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

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 "[email protected]" 
} 

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

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

Update (2013-11-26):

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

Update (2014-11-23):

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

Update (2017-08-04):

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

+1

Обязательные требования к порядку аргументов__страницы не очень ясны, поскольку вы вызываете 'find' с' -O3', который может оценивать тесты в другом порядке. – C2H5OH

+0

Xargs with Find несколько полезен, но я использую File :: Find from Perl. – starbolin

+0

@ C2H5OH, когда я упомянул строгий порядок, я имел в виду то, что навязывается самой. Если заказ не соответствует ожиданиям, поиск приведет к ошибке. Я признаю, что оптимизация может изменить порядок заказа, но это нормально. –

ответ

2

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

+0

Выглядит аккуратно. Я попробую и последую. –

+0

С тех пор, как я попробовал Ack, я пришел к пониманию, что я действительно хочу найти с другим пользовательским интерфейсом. Тем не менее, я нашел Ack полезной альтернативой для большинства моих потребностей. –

+0

Недавно я переключился с Ack на Ag (https://github.com/ggreer/the_silver_searcher), который, по-видимому, немного быстрее. –

Смежные вопросы