Saya mencoba menggabungkan file teks dalam sub-folder dan mencoba:
cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1}/book.txt > out$var
Namun ini tidak mengembalikan apa pun. Jadi, coba tambahkan 'subfolder2' yang tidak ada
cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1,subfolder2}/book.txt > out$var
Dan kali ini berhasil, menyatukan file dengan sukses. Mengapa ini terjadi?
bash
cat
brace-expansion
CDPF
sumber
sumber
echo
alih-alihcat
untuk melihat baris perintah apa yang Anda dapatkan. (Atau gunakanset -x
untuk debugging.)Jawaban:
Menurut definisi, ekspansi brace di GNU Bash membutuhkan ekspresi urutan atau serangkaian nilai yang dipisahkan koma:
Anda dapat membaca manual untuk detailnya.
Beberapa contoh sederhana:
sumber
{subfolder1}
mengevaluasi{subfolder1}
, karena tidak ada alternatif. Gunakansubfolder1
sebagai gantinya.sumber
csh
(dari mana ekspansi brace berasal),tcsh
ataufish
.Kawat gigi hanya akan mengembang jika mereka memiliki string yang dipisahkan koma, untuk misalnya {abc, def} atau rentang, untuk misalnya {a..e} ditentukan di antara mereka.
Dalam kasus Anda, Anda bisa menulis subfolder1 tanpa melampirkannya di kawat gigi karena tidak perlu
sumber
/path/{a,}/filename
mengembang ke dua string/path/a/filename
dan/path//filename
, yang mungkin tidak diinginkan.ambiguous redirect
jika Anda mencoba mengalihkan ke file yang diberikan oleh variabel yang tidak dikutip yang tidak memiliki nilai, misalnyaecho 'hello' >$idontexist
.> *.txt
dengan banyak.txt
file, atau> $file
jika$file
mengandung spasi. Tapi tentu saja tidak ada yang ambigu dalam memberikancat
beberapa argumen