วิธีสร้างแผนผังไดเรกทอรีโดยอัตโนมัติ


11

ฉันกำลังพยายามสร้างแผนผังไดเรกทอรีจาก A ถึง Z โดยที่ไดเรกทอรีถัดไปอยู่ในไดเรกทอรีปัจจุบัน

ตัวอย่างเช่น: B อยู่ภายใน A และ C อยู่ภายใน B และอื่น ๆ ..

-A
--B
---C
----...Z

เบาะแสใด ๆ เกี่ยวกับวิธีทำให้เสร็จโดยอัตโนมัติ?


ฉันสงสัยว่าอะไรคือวัตถุประสงค์ในการใช้งานจริงของไดเรกทอรีดังกล่าว IMHO ลักษณะนี้มากขึ้นเช่นคำถามสำหรับรหัสกอล์ฟ
Melebius

3
@Melebius จุดประสงค์หนึ่งที่เป็นไปได้คือการสร้างโครงสร้างไดเรกทอรีเป็นกรณีทดสอบเพื่อช่วยตรวจสอบว่าคำสั่งสคริปต์หรือแอปพลิเคชันอื่น ๆ ทำงานได้หรือไม่ ต่อไปนี้เป็นตัวอย่างล่าสุดที่คำถามไม่ได้เกี่ยวกับการสร้างโครงสร้างไดเรกทอรีเฉพาะ แต่การรู้วิธีการเขียนคำสั่งให้ทำมีประโยชน์สำหรับวัตถุประสงค์ในการทดสอบไม่ใช่ว่าโครงสร้างเฉพาะถูกประดิษฐ์และแปลก แต่เพราะมัน (เรามีคำถามมากมายเกี่ยวกับการสร้างโครงสร้างไดเรกทอรีเฉพาะซึ่งสามารถค้นหาได้โดยการค้นหา " mkdir -p")
Eliah Kagan

คำตอบ:


25

ด้วยmkdir, printfและการขยายตัวของรั้งทุบตี:

$ mkdir -p "$(printf "%s/" {A..Z})"
$ tree A
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

25 directories, 0 files
  • {A..Z}ขยายA B ... Z,
  • printf "%s/"พิมพ์อาร์กิวเมนต์ด้วย a /หลังพวกมันดังนั้นฉันจะได้A/B/...Z/
  • และmkdir -pสร้างA/B/.../Zไดเรกทอรีด้วยไดเรกทอรีหลักที่จำเป็นต้องสร้าง

ขอบคุณสำหรับสิ่งนั้น คิดว่าฉันได้รับข้อผิดพลาดนี้ในขณะที่ ฉันใช้คำสั่ง mkdir: 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: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
Nish

3
@Nish มีเป็น-pในmkdirคำสั่ง
muru

ฉันไม่ดีฉันลองมันบน mac ของฉันแทนที่จะเป็น Ubuntu และคำถามที่ตามมาก็คือ -> สมมุติว่าฉันต้องการมีไดเรกทอรี A1 .. A100 ภายใน A (ในโครงสร้างเดียวกัน AtoZ) ถ้าอย่างนั้น B1..B100 ภายใน B. ดังนั้นมันจะเป็นแบบนี้ -> imgur.com/jfuKEdf
นิช

11
สมมติว่าคุณโพสต์ติดตามเป็นคำถามจริงแทนที่จะเป็นในความคิดเห็นและไม่ได้ใช้ภาพ แต่เป็นข้อความ นั่นจะดีกว่ามากใช่ไหม
muru

ฉันเข้าใจประเด็นของคุณที่นี่ มันยากที่จะโพสต์มันไม่ได้เป็นรหัสและเอาท์พุทขนาดใหญ่ที่มัน ดังนั้นเพียงแค่ดูที่ภาพหน้าจอทำให้ง่ายต่อการเข้าใจ
Nish

7

ในระดับที่ง่ายมากคุณสามารถใช้ประโยชน์จาก{A..Z}การขยายตัวเพื่อสร้างจดหมายทั้งหมดจากนั้นทำซ้ำและป้อนแต่ละตัว:

~/test_directory$ for d in {A..Z}; do mkdir "$d"; cd "$d"; done
~/test_directory/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$ 

ดังที่คุณเห็นในผลลัพธ์ของพรอมต์ของฉันตอนนี้คุณมีไดเรกตอรีที่โยงโซ่เรียบร้อยแล้ว

อย่างไรก็ตามหากชื่อไดเรกทอรีจริงแตกต่างจากตัวอักษรเพียงอย่างเดียวคุณจะต้องระบุรายชื่อไดเรกทอรีอย่างใดอย่างหนึ่งอาจผ่านไฟล์ซึ่งคุณทำซ้ำและทำกระบวนการเดียวกันอีกครั้ง โดยพื้นฐานแล้วสิ่งนี้

while IFS= read -r dir_name;do mkdir "$dir_name"; cd "$dir_name" ;done < directory_list.txt

นั่นคือเท่ห์ นี่คือคำถามติดตาม สมมติว่าฉันต้องการมี A1 .. A100 ไดเรกทอรีภายใน A (ในโครงสร้างเดียวกัน AtoZ) ถ้าอย่างนั้น B1..B100 ภายใน B. ดังนั้นมันจะเป็นแบบนี้ -> imgur.com/jfuKEdf
Nish

@ นิชอา, นั่นต้องการวงในดังนั้นfor d in {A..Z}; do mkdir "$d"; cd "$d"; for i in {1..100}; do mkdir "${d}${i}" ;done ; done
Sergiy Kolodyazhnyy

หรือแม้กระทั่งไม่มีวงในfor d in {A..Z}; do mkdir "$d"; cd "$d"; mkdir "$d"{1..100}; done
Sergiy Kolodyazhnyy

ขอบคุณสำหรับสิ่งนั้น ดูเหมือนว่าจะทำงานได้ แต่คำสั่งของไดเรกทอรีดูเหมือนจะเมามากขึ้นดังนั้น 2 จะไม่อยู่หลัง 1 เรียงลำดับแบบสุ่ม ยังไงก็ตามที่จะแก้ไขได้? นี่คือภาพหน้าจอ -> imgur.com/a/Zqj1c
Nish

@ การเรียงลำดับแบบเรียบง่ายเป็นแบบข้อความไม่ใช่ตัวเลขอย่างที่ฉันคิดว่าคุณคาดหวัง เท่าที่treeฉันไม่แน่ใจว่าจะแก้ไขได้อย่างไร แต่ฉันคิดว่านี่อาจไม่ใช่treeปัญหา แต่เป็นคำสั่งการเรียงลำดับของเชลล์ ฉันขอแนะนำให้ถามคำถามจริงเกี่ยวกับที่นี่หรือดีกว่าได้ที่ unix.stackexchange.com
Sergiy Kolodyazhnyy

2

แม้ว่าวิธีของคุณครูprintfจะไม่สามารถเอาชนะได้ แต่ฉันก็ชอบjotสิ่งนี้เป็นส่วนตัว jotไม่ได้ติดตั้งเป็นค่าเริ่มต้นใน Ubuntu athena-jotแพคเกจให้มัน คำสั่งเหล่านี้ใช้ได้ผล:

mkdir -p "$(jot -s/ -c 26 A)"
jot -s/ -c 26 A | xargs mkdir -p

จริงๆคำสั่งใด ๆ ที่สร้างลำดับของตัวอักษรและร่วมกับพวกเขาด้วยเครื่องหมายทับจะอำนวยความสะดวกนี้เพราะผลผลิตของตนนั้นจะสามารถส่งผ่านไปยังmkdir -pทั้งผ่านแทนคำสั่ง (ในขณะที่คำตอบของ Muru ) xargsหรือการใช้ นี่คือตัวอย่างบางส่วนที่ใช้เครื่องมือบางอย่างและxargsไม่ต้องการให้คุณติดตั้งซอฟต์แวร์ยกเว้นในระบบที่น้อยที่สุดหรือ Ubuntu Core:

perl -we 'print join "/", A..Z' | xargs mkdir -p
ruby -we 'print (?A..?Z).to_a * ?/' | xargs mkdir -p
python3 -c 'print("/".join(__import__("string").ascii_uppercase))' | xargs mkdir -p

เก่าอูบุนตูรุ่นมาพร้อมกับงูหลาม 2 แทนของงูใหญ่ 3. เพื่อที่เพียงแค่เปลี่ยนpython3เพื่อpythonที่จะทำให้การทำงานของคำสั่งสุดท้ายถ้าคุณอยากที่จะทำเช่นนี้กับงูหลาม

ในทำนองเดียวกันวิธีที่สั้นและเรียบง่ายของ muruสามารถเขียนทับได้:

printf '%s/' {A..Z} | xargs mkdir -p

ส่วนท้าย/ในพา ธ ไดเร็กทอรีmkdir -pถูกขอให้สร้างไม่มีปัญหาและเป็นที่นิยมมากกว่า แต่ก็ไม่เป็นไรที่จะละเว้นเช่นเดียวกับตัวอย่างอื่นในคำตอบนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.