kstep 19.10.2009 19:02
Tips & tricks — Zsh-алиасы — find ещё проще
Я очень часто использую связку find и grep для сложного поиска по файлам.Наиболее частый вариант:
1 |
|
Очень уж длинно. Захотелось это укоротить, но не теряя при этом выразительности =)
Для начала упростим сам вызов find:
1 |
|
Теперь как-то надо ужать «-exec grep».
В zsh есть такая разновидность алиасов, как глобальные. Это такие алиасы, которые раскрываются
не только в будучи в начале строки (на месте команды), но и в любом другом её месте.
Их и используем:
1 |
|
Параметр -g задаёт тот самый глобальные алиас, двойной дефис «--» нужен для того, чтобы
команда alias не путала имена алиасов, начинающиеся с дефиса, со своими параметрами.
В итоге первая команда запишется просто и изящно:
1 |
|
Вот такой баланс краткости и выразительности.
А заодно и пример использования алиасов для новичков (я надеюсь, полезный =)
exelens 19.10.2009 19:11 #
+ 0 -
В следующий раз прошу ставить КАТ
У локейта есть два больших минуса:
1) он ищет не по живой фс, а по индексам, то есть не по актуальным данным. Он хорош, когда нужен глобальный поиск по всей фс, в особенности по той её части, которая редко меняется (установленные пакеты, глобальные конфиги и мануалы-доки например), если нужен поиск по небольшой ветке каталогов и критична актуальность файлов (например при разработке ПО), то лучше find, т.к. он всегда акутален (не будешь же каждые две секунда запускать updatedb на каталоге, в котором всё меняется каждую секунду? А скорость поиска find'ом по такому малому дереву вполне себе огромна.
2) он не даёт такой гибности поиска, как find. Попробуй с помощью локейта исключить файлы по их mode'у. Или искать только симлинки. Или ещё скомбинировать несколько разных сложных фильтров. Без дополнительного find/grep-а не обойдёшься. Если нужен сложный поиск по множеству критериев, то опять же find лучше, locate разве что может сузить область такого поиска.
В общем это два разных инструмента и нельзя предпочесть один другому во всех случаях. Не будешь же ты забивать гвозди отвёрткой?
1) он ищет не по живой фс, а по индексам, то есть не по актуальным данным. Он хорош, когда нужен глобальный поиск по всей фс, в особенности по той её части, которая редко меняется (установленные пакеты, глобальные конфиги и мануалы-доки например), если нужен поиск по небольшой ветке каталогов и критична актуальность файлов (например при разработке ПО), то лучше find, т.к. он всегда акутален (не будешь же каждые две секунда запускать updatedb на каталоге, в котором всё меняется каждую секунду? А скорость поиска find'ом по такому малому дереву вполне себе огромна.
2) он не даёт такой гибности поиска, как find. Попробуй с помощью локейта исключить файлы по их mode'у. Или искать только симлинки. Или ещё скомбинировать несколько разных сложных фильтров. Без дополнительного find/grep-а не обойдёшься. Если нужен сложный поиск по множеству критериев, то опять же find лучше, locate разве что может сузить область такого поиска.
В общем это два разных инструмента и нельзя предпочесть один другому во всех случаях. Не будешь же ты забивать гвозди отвёрткой?
имхо глобальные алиасы тут не ахти подходят, функции было бы проще, вышло что-нить вроде такого
bla () {find . -xdev -name "$1" -exec grep "def __init__" {} $2 }
ну и про xargs не забываем, с ним find всё-таки немного проще(имхо, конечно)
Ты прав, конечно. Я тоже делал подобные функции с файндом и грепом (только вместо текста $2 =).
Только одна беда, ИМХО: страдает выразительность, а я её люблю =)
Собственно мне нравится выразительность запросного «языка» findа,
и хотелось его просто расширить новыми командами, так что их можно использовать
не только как новые команды, но и в составе других поисковых файнд выражений (find /usr/local/bin -executable -grep "bin/bash" -all какой-нить например.)
В общем весь пост — моё ИМХО. Я пробовал разные подходы к упрощению своей работы,
но этот пережил генетический отбор и до сих пор используется =)
Только одна беда, ИМХО: страдает выразительность, а я её люблю =)
Собственно мне нравится выразительность запросного «языка» findа,
и хотелось его просто расширить новыми командами, так что их можно использовать
не только как новые команды, но и в составе других поисковых файнд выражений (find /usr/local/bin -executable -grep "bin/bash" -all какой-нить например.)
В общем весь пост — моё ИМХО. Я пробовал разные подходы к упрощению своей работы,
но этот пережил генетический отбор и до сих пор используется =)