Jadi, dengan bashekspansi alfabet, ini berfungsi:
set {a..z}
for a do printf "./$a/$a%s\n" "$@"
done | xargs mkdir -p
Dan jika Anda cukup mengetikkan alfabet satu kali di baris pertama, konsep yang sama harus portabel untuk semua shell. Ada cara lain untuk sampai pada garis yang ditetapkan jika Anda tidak ingin mengetiknya seperti:
seq -sP32P 97 123|dc
a b c d e f g h i j k l m n o p q r s t u v w x y z
... misalnya berfungsi di lokal ASCII. Jadi Anda bisa melakukan set $(seq -sP32P 97 123|dc)atau perintah lain yang akan membuat Anda $IFSdaftar terpisah dari argumen yang Anda butuhkan, tapi, maksud saya, mungkin lebih baik hanya menggunakan bashhal itu atau mengetiknya.
Bagaimanapun, saya pikir itulah cara saya akan melakukannya jika hanya karena itu hanya memanggil mkdirsesering yang diperlukan.
Dan hanya untuk mendemonstrasikan cara kerjanya, berikut adalah sedikit hasil debug dari kumpulan yang lebih kecil:
sh -cx 'for n do printf "./$n/$n%s\n" "$@"; done|cat' -- arg1 arg2 arg3
+ for n in '"$@"'
+ printf './arg1/arg1%s\n' arg1 arg2 arg3
+ cat
+ for n in '"$@"'
+ printf './arg2/arg2%s\n' arg1 arg2 arg3
+ for n in '"$@"'
+ printf './arg3/arg3%s\n' arg1 arg2 arg3
./arg1/arg1arg1
./arg1/arg1arg2
./arg1/arg1arg3
./arg2/arg2arg1
./arg2/arg2arg2
./arg2/arg2arg3
./arg3/arg3arg1
./arg3/arg3arg2
./arg3/arg3arg3
Seperti yang Anda lihat, forsatu - satunya loop sekali per indeks posisi parameter array, yang saya set di sini hanya dengan menyerahkan shparameter saat doa, dan di atas dengan set ${positionals}. Tetapi printfmenerima array yang sama dalam daftar argumennya untuk setiap iterasi dan menerapkan format string untuk setiap argumennya, sehingga Anda mendapatkan kemiripan rekursi tanpa rekursi yang tidak perlu.
Dan menambahkan done|commandakan mengalirkan semua forkeluaran loop di atas pipa dengan cara yang sama done >fileakan mengalirkan semuanya ke dalam file - hanya membuka dan menutup file output sekali untuk seluruh for...donekonstruksi.