Cara otomatis untuk membuat pohon direktori

11

Saya mencoba membuat pohon direktori dari A ke Z di mana direktori berikutnya berada di dalam direktori saat ini.

Sebagai contoh: B berada di dalam A dan C berada di dalam B dan seterusnya ..

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

Adakah petunjuk tentang cara menyelesaikannya dengan cara otomatis?

Nish
sumber
Saya bertanya-tanya apa tujuan praktis dari direktori semacam itu. IMHO ini lebih mirip pertanyaan untuk Code Golf .
Melebius
3
@Melebius Salah satu tujuan yang mungkin adalah membuat struktur direktori sebagai test case, untuk membantu memverifikasi bahwa beberapa perintah lain, skrip, atau properti aplikasi berfungsi. Berikut adalah contoh baru-baru ini di mana pertanyaan itu sendiri bukan tentang membuat struktur direktori tertentu, tetapi mengetahui bagaimana menulis perintah untuk melakukannya berguna untuk tujuan pengujian, tidak terlepas dari bagaimana struktur spesifik dibuat dan aneh, tetapi karena itu. (Kami juga memiliki banyak pertanyaan tentang membuat struktur direktori spesifik, yang dapat ditemukan dengan mencari " mkdir -p".)
Eliah Kagan

Jawaban:

25

Dengan mkdir, printfdan ekspansi brace bash:

$ 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}memperluas ke A B ... Z,
  • printf "%s/"mencetak argumen dengan /setelahnya, jadi saya mengertiA/B/...Z/
  • dan mkdir -pmembuat A/B/.../Zdirektori dengan direktori induk apa pun yang perlu dibuat.
muru
sumber
Terima kasih untuk itu. Kupikir aku mendapatkan kesalahan ini sementara. Saya menggunakan perintah 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: Tidak ada file atau direktori seperti itu
Nish
3
@Nish Ada -pdalam mkdirperintah.
muru
saya buruk, saya mencobanya di mac saya bukannya ubuntu. Dan pertanyaan tindak lanjut adalah ini -> katakanlah saya ingin memiliki direktori A1..A100 dalam A (dalam struktur yang sama AtoZ). Kemudian B1..B100 dalam B. Jadi terlihat seperti ini -> imgur.com/jfuKEdf
Nish
11
Misalkan Anda memposting tindak lanjut sebagai pertanyaan aktual alih-alih di komentar, dan tidak menggunakan gambar tetapi teks. Itu akan jauh lebih baik, bukan?
muru
Saya mengerti maksud Anda di sini. Sulit untuk mempostingnya sebagai bukan kode dan output yang besar pada saat itu. Jadi hanya dengan melihat tangkapan layar membuatnya lebih mudah untuk dipahami.
Nish
7

Pada tingkat yang sangat sederhana, Anda dapat menggunakan {A..Z}ekspansi untuk menghasilkan semua huruf, lalu secara iteratif membuat dan memasukkan masing-masing:

~/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$ 

Seperti yang Anda lihat di output prompt saya, sekarang Anda memiliki direktori yang benar-benar dirantai.

Namun, jika nama direktori aktual berbeda dari sekadar alfabet, Anda harus entah bagaimana memberikan daftar nama direktori, mungkin melalui file, yang Anda gunakan untuk mengulang dan melakukan proses yang sama lagi. Pada dasarnya ini

while IFS= read -r dir_name;do mkdir "$dir_name"; cd "$dir_name" ;done < directory_list.txt
Sergiy Kolodyazhnyy
sumber
itu keren sekali. Ini pertanyaan lanjutannya. katakanlah saya ingin memiliki direktori A1..A100 dalam A (dalam struktur yang sama AtoZ). Kemudian B1..B100 dalam B. Jadi terlihat seperti ini -> imgur.com/jfuKEdf
Nish
@Nah ah, itu akan membutuhkan loop batin begitufor d in {A..Z}; do mkdir "$d"; cd "$d"; for i in {1..100}; do mkdir "${d}${i}" ;done ; done
Sergiy Kolodyazhnyy
Atau bahkan tanpa loop dalam,for d in {A..Z}; do mkdir "$d"; cd "$d"; mkdir "$d"{1..100}; done
Sergiy Kolodyazhnyy
Terima kasih untuk itu. Tampaknya berfungsi tetapi urutan direktori tampaknya kacau sehingga 2 tidak setelah 1. Diurutkan secara acak. Pokoknya untuk memperbaikinya? Berikut screenshot -> imgur.com/a/Zqj1c
Nish
@Nish Sorting order berbasis teks, bukan numerik seperti yang saya kira Anda harapkan. Sejauh ini tree, saya tidak yakin bagaimana cara memperbaikinya, tapi saya pikir ini bahkan mungkin bukan treemasalah, melainkan urutan penyortiran shell. Saya sarankan mengajukan pertanyaan aktual tentang hal itu di sini atau lebih baik lagi di unix.stackexchange.com
Sergiy Kolodyazhnyy
2

Meskipun cara muruprintf tidak bisa dikalahkan, saya pribadi suka jotuntuk hal semacam ini. jottidak diinstal secara default di Ubuntu. The athena-jotmenyediakan paket. Salah satu dari perintah ini berfungsi:

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

Benar-benar setiap perintah yang menghasilkan urutan huruf dan bergabung dengan garis miring akan memfasilitasi ini, karena hasilnya kemudian dapat diteruskan ke mkdir -psalah satu melalui substitusi perintah (seperti dalam jawaban muru ) atau menggunakan xargs. Berikut adalah beberapa contoh menggunakan beberapa alat dan xargsyang tidak mengharuskan Anda menginstal perangkat lunak, kecuali mungkin pada sistem yang sangat minim atau 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

Rilis tua Ubuntu datang dengan Python 2 bukannya Python 3. Untuk itu, hanya mengubah python3untuk pythonmembuat pekerjaan perintah terakhir, jika Anda benar-benar ingin melakukan ini dengan Python.

Demikian pula, cara pendek dan sederhana muru dapat ditulis sebagai alternatif:

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

Trailing /, di jalur direktori mkdir -pdiminta untuk dibuat, tidak ada masalah dan bisa dibilang lebih disukai gaya. Tapi tidak masalah untuk menghilangkannya, seperti contoh-contoh lain dalam jawaban ini.

Eliah Kagan
sumber