Kapan Anda menggunakan ekspansi brace?

49

Saya mengerti apa itu brace expansion , tapi saya tidak tahu cara terbaik untuk menggunakannya.

Kapan Anda menggunakannya?
Tolong ajari saya beberapa contoh yang nyaman dan luar biasa jika Anda memiliki tip Anda sendiri.

Benjamin
sumber

Jawaban:

52

Perluasan brace sangat berguna jika Anda memiliki nama jalur yang panjang. Saya menggunakannya sebagai cara cepat untuk membuat cadangan file :

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

akan menyalin /a/really/long/path/to/some/file.txtke/a/really/long/path/to/some/file.txt.bak

Anda juga dapat menggunakannya secara berurutan . Saya pernah melakukannya untuk mengunduh banyak halaman dari web:

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

atau

for i in {1..100}
do
   #do something 100 times
done
dogbane
sumber
8
Ini dapat digunakan untuk duplikasi argumen juga. Katakanlah Anda memiliki beberapa program yang memerlukan argumen '-f' untuk setiap file untuk beroperasi. alih-alih melakukan program -f file1 -f file2 -f file3, Anda bisa melakukannyaprogram "-f file"{1..3}
Patrick
Ini memalukan. Saya baru saja menemukannya tetapi melakukan backup pada jalur ekstra panjang selama bertahun-tahun tanpa mengetahui rhis. Terima kasih.
smonff
2
@Patrick: Itu gagal karena programmendapat tiga kata: "-f file1" "-f file2" "-f file3", bukan 6: "-f" "file1" "-f" "file2" "-f" "file3".
musiphil
@dogbane: Menggunakan ekspansi untuk digunakan dalam satu forlingkaran agak tidak ada gunanya, karena Anda dapat menulis for ((i=1; i<=100; i++))dan lebih efisien.
musiphil
30

Ekspansi Brace sangat berguna saat membuat struktur direktori besar:

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

Ini akan memberimu

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

Anda bahkan bisa melangkah lebih jauh dan memasukkan ekspansi brace ke ekspansi brace:

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

Ini akan memberi Anda struktur direktori yang sama dengan contoh di atas.

Kristen
sumber
3
Bersarang itu bagus, tetapi contoh sarang Anda ( mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}) sebenarnya tidak melayani tujuan apa pun. Anda bisa saja melakukan ini: mkdir -p dir1/subdir{1,2}/subsubdir{1,2}.
iconoclast
@iconoclast, itu melayani tujuan jika Anda menafsirkan subdir1dan subdir2dalam arti non-literal. Ganti subdir1dengan catdan subdir2dengan dogmisalnya.
ephsmith
2
@ephsmith: jika Anda mengartikan "subdir1" sebagai singkatan dari "cat" dan "subdir2" untuk "dog", maka contoh sarang gagal, karena ia menggunakan subdir {1,2}, dan tidak ada string yang dapat Anda ganti "subdir" dengan itu akan membuat subdir {1,2} kembali {cat, dog}.
iconoclast
21

Saya menggunakannya ketika saya ingin mengurangi mengetik:

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

Contoh lain:

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

Saya menggunakannya untuk membandingkan hasil tes aktual dengan hasil tes yang diinginkan selama pengembangan. Jika tes # 41 gagal, mudah untuk melihat apa perbedaan antara output tes (dalam file tests.output / 041) dan output yang diinginkan (dalam file tests.out / 041):

$ diff tests.{out,output}/041
Bruce Ediger
sumber
10

Beberapa kasus yang sering saya alami adalah:

Untuk mengganti nama:

mv myText.{txt,tex}

atau

mv myText.tex{,.old}

atau

cp myText.tex{,.backup}

(Meskipun kurang berantakan untuk menggunakan kontrol versi untuk 2 tugas terakhir.)

Untuk membandingkan (sudah disebutkan):

diff path{1,2}/a.txt
imz - Ivan Zakharyaschev
sumber
3

Ada beberapa jawaban yang bagus di sini, tetapi tidak ada yang menyebutkan kapan tidak menggunakan ekspansi brace. Seperti penjawab lainnya, saya menggunakan sedikit penjepit pada baris perintah. Saya juga menggunakannya di alias dan fungsi saya karena saya dapat mengharapkan shell cerdas.

Saya tidak menggunakannya dalam skrip shell saya (kecuali ada beberapa alasan mengapa skrip harus bash atau zsh, meskipun dalam kasus tersebut, yang terbaik adalah meng-upgrade ke bahasa skrip "nyata" seperti perlatau python). Ekspansi Brace tidak portabel karena tidak dalam standar shell POSIX. Bahkan jika bekerja di Anda /bin/sh- shebang skrip ed shell, itu tidak akan bekerja pada sistem dengan lebih dilucuti /bin/shkerang (misalnya dash).

Dalam hal perbedaan satu digit, Anda tidak perlu ekspansi penjepit; kelas karakter sudah cukup:

Bashism:

diff file{1,2}

Portabel:

diff file[12]
Adam Katz
sumber
3
Perbedaannya adalah bahwa file{1,2}akan selalu diperluas ke file1 file2, sementara file[12]hanya memperluas ke nama file yang ada: yaitu jika file1ada tetapi file2tidak, file[12]diperluas menjadi file1hanya. The []ekspansi benar-benar versi terbatas dari ?ekspansi (dan mereka disebut "ekspansi pathname").
musiphil
Benar, ekspansi brace tidak shell globbing (ekspansi alias pathname). Itu adalah info bagus yang belum benar-benar disebutkan: ekspansi brace lebih baik dalam mencatat jalur yang tiba-tiba tidak ada. Anda juga dapat menggulirkan ekspansi brace dalam.
Adam Katz