Когда вы используете расширение скобки?


49

Я понимаю, что такое расширение скобок , но я не знаю, как лучше его использовать.

Когда вы используете это?
Пожалуйста, научите меня некоторым удобным и замечательным примерам, если у вас есть свой совет.

Ответы:


52

Расширение скобок очень полезно, если у вас длинные имена путей. Я использую это как быстрый способ сделать резервную копию файла :

cp /a/really/long/path/to/some/file.txt{,.bak}

будет копировать /a/really/long/path/to/some/file.txtв/a/really/long/path/to/some/file.txt.bak

Вы также можете использовать его в последовательности . Однажды я сделал так, чтобы загрузить много страниц из Интернета:

wget http://domain.com/book/page{1..5}.html

или же

for i in {1..100}
do
   #do something 100 times
done

8
Это также может быть использовано для дублирования аргументов. Скажем, у вас есть какая-то программа, которая требует аргумент '-f' для каждого файла, с которым нужно работать. вместо того, чтобы делать program -f file1 -f file2 -f file3, вы можете сделатьprogram "-f file"{1..3}
Патрик

Это позор. Я только что обнаружил это, но делал резервные копии на очень длинных путях в течение многих лет, не зная его. Благодарю.
Smonff

2
@Patrick: Это терпит неудачу , потому programполучает три слова: "-f file1" "-f file2" "-f file3", вместо 6: "-f" "file1" "-f" "file2" "-f" "file3".
Musiphil

@ Dogbane: Использование расширения для использования в forцикле немного бессмысленно, так как вы можете писать, for ((i=1; i<=100; i++))и это более эффективно.
Musiphil

30

Расширение скобок очень удобно при создании больших структур каталогов:

mkdir -p dir1/{subdir1,subdir2}/{subsubdir1,subsubdir2}

Это даст вам

find dir1 -type d
dir1
dir1/subdir1
dir1/subdir1/subsubdir1
dir1/subdir1/subsubdir2
dir1/subdir2
dir1/subdir2/subsubdir1
dir1/subdir2/subsubdir2

Вы могли бы даже сделать еще один шаг и добавить расширение скобки в расширение скобки:

mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}

Это даст вам ту же структуру каталогов, что и в примере выше.


3
Вложение это хорошо, но ваш пример ( mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}) фактически не имеет никакого значения. Вы могли бы просто сделать это: mkdir -p dir1/subdir{1,2}/subsubdir{1,2}.
иконоборчество

@iconoclast, это действительно служит цели, если вы интерпретируете subdir1и subdir2в не буквальном смысле. Заменить subdir1на catи subdir2с, dogнапример.
Эфсмит

2
@ephsmith: если вы интерпретируете «subdir1» как заменяющий «cat» и «subdir2» как «собака», то пример вложенности завершается неудачей, поскольку он использует subdir {1,2}, и нет строки, которую можно заменить «subdir» с этим сделает subdir {1,2} return {cat, dog}.
иконоборчество

21

Я использую его, когда хочу уменьшить количество набираемых текстов:

geany /path/to/file1 /path/to/file2
# versus
geany /path/to/file{1,2}

Другой пример:

wajig install libpam0g-dev libiw-dev libdb-dev
# versus
wajig install lib{pam0g,iw,db}-dev

12

Я использую его для сравнения фактического результата теста с желаемым результатом теста во время разработки. Если тест № 41 не пройден, легко увидеть разницу между тестовым выводом (в файле tests.output / 041) и желаемым выводом (в файле tests.out / 041):

$ diff tests.{out,output}/041

10

Некоторые частые случаи для меня:

Для переименования:

mv myText.{txt,tex}

или же

mv myText.tex{,.old}

или же

cp myText.tex{,.backup}

(Хотя использовать управление версиями для последних двух задач не так уж и сложно.)

Для сравнения (уже упоминалось):

diff path{1,2}/a.txt

3

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

Я не использую его в своих сценариях оболочки (если только по какой-то другой причине сценарии должны быть bash или zsh, хотя в этих случаях лучше всего перейти на «настоящий» язык сценариев, такой как perlили python). Расширение Brace не является переносимым, поскольку оно не входит в стандарт оболочки POSIX. Даже если он работает в ваших /bin/sh- притон скриптов ред оболочки, он не будет работать на системах с более раздели /bin/shоболочек (например dash).

В случае разницы в одну цифру вам не нужно расширять скобки; Класс персонажа будет достаточно:

Bashism:

diff file{1,2}

Портативный:

diff file[12]

3
Разница в том, что file{1,2}он всегда будет расширяться file1 file2, в то время как будет file[12]расширяться только до существующих имен файлов: то есть, если file1существует, но file2не будет, file[12]расширяется file1только до . []Расширение действительно ограниченная версия ?расширения (и они называются «имя пути расширения»).
Musiphil

Правильно, расширение скобки - это не глобализация оболочки (расширение пути). Это хороший призыв, который еще не был упомянут: расширение фигурных скобок лучше замечать неожиданно отсутствующие пути. Вы также можете использовать расширение скобки.
Адам Кац
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.