Коли ви використовуєте розширення дужок?


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, наприклад.
ephsmith

2
@ephsmith: якщо ви інтерпретуєте "subdir1" як "cat", а "subdir2" - "dog", то приклад введення не вдається, оскільки він використовує subdir {1,2}, і немає рядка, який можна замінити "subdir" з цим змусить subdir {1,2} повернути {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 не вдається, легко зрозуміти, у чому різниця між тестовим результатом (у файлі тести.

$ 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). Розширення дужки не є портативним, оскільки воно не є стандартом оболонки POSIX. Навіть якщо він працює в ваших /bin/sh- притон скриптів ред оболонки, він не буде працювати на системах з більш роздягли /bin/shоболонок (наприклад dash).

У разі різниці однієї цифри вам не потрібно розширення дужок; класу символів буде достатньо:

Башизм:

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.