Есть ли какая-нибудь утилита Unix, которая позволит мне создавать несколько файлов с небольшим набором текста?
Вопрос
Прямо сейчас я делаю это много:
find * | grep py$ | xargs grep foo
Я помню, что есть какая-то утилита, которая делает это с меньшим набором текста, но какая?
ОБНОВЛЕНИЕ: я предпочитаю использовать оболочку Bash, если это возможно.
Решение
Мне нравится ack :
Что бы вы предпочли напечатать?
$ grep pattern $ (find. -type f | grep -v '\ .svn')
$ ack pattern
Другие советы
Возможно, вам поможет ваша оболочка. Например, в zsh вы можете сделать
grep foo **/*.py
при условии, что количество файлов .py не превышает максимально допустимое количество аргументов для команды (64 КБ?). Обратите внимание, что вы можете определить глобализацию файла, например.
grep foo **/*.py(mh-5)
, который даст вам все, что изменилось за последние 5 часов.
Вы пробовали ack . Р>
У zsh есть рекурсивное сглаживание, так что вы можете сделать
grep foo **/*.py
Смотри, ма, не найди:)
ОБНОВЛЕНИЕ: О, также, если вы делаете что-то много, это, конечно, не мешает псевдониму или написанию для него функции
Это называется grep * wink *: -)
Все py в текущем каталоге
grep -R foo *.py
Все файлы в текущем и любом подкаталоге
grep -R foo .
find . -name "*.py" -exec grep -H foo '{}' ';'
grep -r --include='*.py' foo *
Я часто использую что-то очень похожее на вашу пару find / grep, хотя и с еще большим количеством условий - исключая, например, файлы в каталогах .svn. Я делаю это так много, что только что создал сценарии вокруг этих вызовов, так что я могу вызвать " src-grep ... " и сделать это в основном то, что вы делаете здесь. (Затем я добавил необязательное расширение для ряда строк контекста для передачи в флаг grep -C, если он есть, и отдельную версию, чтобы получить результаты для операторов определения.)
Это более полезно и быстрее, чем рекурсивный grep для меня.