ดังนั้นด้วยbashการขยายตัวของตัวอักษรงานนี้:
set {a..z}
for a do printf "./$a/$a%s\n" "$@"
done | xargs mkdir -p
และถ้าคุณพิมพ์ตัวอักษรเพียงครั้งเดียวในบรรทัดแรกแนวคิดเดียวกันควรพกพาไปยังเปลือกหอยใด ๆ มีวิธีอื่น ๆ ที่จะมาถึงที่บรรทัดที่กำหนดถ้าคุณไม่ต้องการพิมพ์เช่น:
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
... เช่นอินสแตนซ์ทำงานในโลแคล ASCII ดังนั้นคุณสามารถทำset $(seq -sP32P 97 123|dc)หรือคำสั่งอื่น ๆ ที่จะทำให้คุณมี$IFSรายการของการขัดแย้งที่คุณต้องการแยกกัน แต่ฉันหมายความว่ามันอาจจะดีกว่าที่จะใช้bashสิ่งนั้นหรือพิมพ์มัน
อย่างไรก็ตามฉันคิดว่านั่นเป็นวิธีที่ฉันจะทำได้ถ้าเพียงเพราะมันเรียกใช้mkdirบ่อยเท่าที่จำเป็น
และเพื่อแสดงให้เห็นถึงวิธีการทำงานนี่เป็นข้อบกพร่องเล็กน้อยของชุดเล็ก:
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
ในขณะที่คุณสามารถดูforลูปเพียงครั้งเดียวต่อดัชนีพารามิเตอร์อาร์เรย์ตำแหน่งซึ่งผมนี่ตั้งโดยเพียงแค่การยื่นพารามิเตอร์ที่ภาวนาและข้างต้นด้วยsh set ${positionals}แต่printfได้รับอาร์เรย์เดียวกันในรายการอาร์กิวเมนต์สำหรับแต่ละการวนซ้ำและใช้สตริงการจัดรูปแบบกับอาร์กิวเมนต์แต่ละตัวดังนั้นคุณจะได้รับการเรียกซ้ำโดยไม่ต้องเรียกซ้ำ
และการเพิ่มdone|commandจะส่งกระแสข้อมูลทั้งหมดของforลูปไปยังไพพ์ในทางเดียวกันdone >fileจะสตรีมข้อมูลทั้งหมดลงในไฟล์ - เปิดและปิดไฟล์เอาต์พุตเพียงครั้งเดียวสำหรับการfor...doneสร้างทั้งหมด