Jadi, dengan bash
ekspansi 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 $IFS
daftar terpisah dari argumen yang Anda butuhkan, tapi, maksud saya, mungkin lebih baik hanya menggunakan bash
hal itu atau mengetiknya.
Bagaimanapun, saya pikir itulah cara saya akan melakukannya jika hanya karena itu hanya memanggil mkdir
sesering 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, for
satu - satunya loop sekali per indeks posisi parameter array, yang saya set di sini hanya dengan menyerahkan sh
parameter saat doa, dan di atas dengan set ${positionals}
. Tetapi printf
menerima 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|command
akan mengalirkan semua for
keluaran loop di atas pipa dengan cara yang sama done >file
akan mengalirkan semuanya ke dalam file - hanya membuka dan menutup file output sekali untuk seluruh for...done
konstruksi.