Может показаться, что я задаю то же самое, что и этот вопрос , но у меня другие требования. Это пример моей файловой системы:
- /код/
- внутренний /
- DEV /
- основной/
- общественности /
- DEV /
- основной/
- выпуск/
- инструменты/
- внутренний /
/code/internal/dev/
, /code/public/dev/
И /code/tools/
содержать подкаталоги для нескольких проектов. Я работаю почти исключительно в ветвях разработки /code/internal/
и /code/public/
и часто хочу найти текстовую строку в этих каталогах вместе с /code/tools/
(у которой нет ветвей). В этих случаях мне нужно выполнить три отдельные команды:
$ grep -r "some string" /code/internal/dev/
$ grep -r "some string" /code/public/dev/
$ grep -r "some string" /code/tools/
Я хотел бы знать, есть ли одна команда, чтобы сделать это. Если нет, то мне, скорее всего, нужно написать простой скрипт bash.
grep: /code/internal/dev/*.cs: No such file or directory
если я не удалю*.cs
из команды. Это моя вина, потому что я поставил*.cs
в своем вопросе изначально.Если вы хотите максимально использовать подстановочные знаки (и иерархия, которую вы разместили, полна), вы можете сделать
Объяснение:
Первый шаг - расширение списка скобок.
foo{bar,baz}qux
расширяется доfoobarqux foobazqux
. То есть для каждого элемента в списке, разделенного запятыми, создается отдельное слово, к которому прикрепляется префикс и часть постфикса. Вы можете увидеть, как это работает, выполнивкакие выводы
Обратите внимание, что это также работает с несколькими скобками, а также с пустыми аргументами; например
дает
Итак, после расширения скобки ваша команда выглядит так:
Следующий шаг - расширение по шаблону. Вы уже знаете это для
*.cs
части, но это также работает для промежуточных каталогов; Более того, если a/
следует, только каталоги сопоставляются. Поэтому, учитывая вашу иерархию (и составляя имена файлов для.cs
файлов), вы получите команду:Только после того, как все это произошло,
grep
вызывается с этим списком аргументов (обратите внимание, что то же самое происходит с вашими исходными командами;grep
никогда не открывается*
; расширение, которое полностью выполняетсяbash
перед вызовомgrep
).источник