ดังนั้นด้วย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
สร้างทั้งหมด