ブレース拡張はいつ使用しますか?


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}
パトリック

これは残念です。私はちょうどそれを発見したが、rhisを知らずに何年も余分な長いパスでバックアップのことをする。ありがとう。
smonff

2
@Patrick:program3つの単語を取得するため、失敗します:"-f file1" "-f file2" "-f file3"6:ではなく、"-f" "file1" "-f" "file2" "-f" "file3"
ムシフィル

@dogbane:forループで使用するために展開を使用することは、あなたが書くことができ、for ((i=1; i<=100; i++))より効率的であるため、少し無意味です。
ムシフィル

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

@iconoclast、非リテラルの意味で解釈するsubdir1と 、目的に役立ちますsubdir2。元に戻しsubdir1catsubdir2してdog例えば。
ephsmith

2
@ephsmith:「cat」の代わりに「subdir1」を解釈し、「dog」の代わりに「subdir2」を解釈すると、subdir {1,2}を使用し、置換できる文字列がないため、ネストの例は失敗します。 「subdir」を指定すると、subdir {1,2}は{cat、dog}を返します。
iconoclast

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}

(最後の2つのタスクにバージョン管理を使用する方が面倒ではありませんが。)

比較するために(すでに述べた):

diff path{1,2}/a.txt

3

ここにはいくつかの優れた答えがありますが、ブレース拡張を使用しない場合について言及しているものはありません。他の回答者と同じように、コマンドラインでブレース展開をかなり使用します。スマートシェルが期待できるため、エイリアスと関数でも使用します。

シェルスクリプトで使用しませ(スクリプトがbashまたはzshである他の理由がない限り、これらの場合、perlまたはのような「実際の」スクリプト言語にアップグレードするのが最善pythonです)。 ブレース展開は POSIXシェル標準にないため、移植性がありません。それはあなたで動作する場合であっても/bin/sh- シェバング編シェルスクリプト、それはより多くの剥奪を持つシステムでは動作しません/bin/shシェル(例えばdash)。

1桁の違いの場合、中括弧の拡張は必要ありません。文字クラスで十分です:

バシズム:

diff file{1,2}

ポータブル:

diff file[12]

3
違いは、file{1,2}常にに展開するのに対しfile1 file2file[12]既存のファイル名にのみ展開することです。つまり、file1存在する場合は存在file2しないが、のみにfile[12]展開しfile1ます。[]拡大は本当にの制限されたバージョンで?拡大(と、彼らは「パス名展開」と呼ばれています)。
ムシフィル

正しい、ブレースの展開はシェルのグロビングではありません(別名パス名展開)。まだ言及されていない良い呼び出しです。ブレースの展開は、パスが予期せず存在しないことに注意するのに適しています。また、ブレース展開内でグロブすることもできます。
アダム・カッツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.