Dizin ağacı oluşturmanın otomatik yolu


11

A'dan Z'ye bir sonraki dizinin geçerli dizin içinde olduğu bir dizin ağacı yapmaya çalışıyorum.

Örneğin: B A içindedir ve C B içindedir ve böyle devam eder.

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

Otomatik şekilde nasıl yapılacağına dair ipuçları var mı?


Bu tür dizinlerin pratik amacının ne olduğunu merak ediyorum. IMHO bu daha çok Code Golf için bir soru gibi görünüyor .
Melebius

3
@Melebius Olası bir amaç, başka bir komut, komut dosyası veya uygulamanın özelliklerinin çalıştığını doğrulamaya yardımcı olmak için test durumu olarak bir dizin yapısı oluşturmaktır. İşte son örneği sorunun kendisi belirli dizin yapılarını oluştururken, ancak belirli yapısı yapmacık ve garip nasıl rağmen, bunu test amaçlar için yararlı oldu komutları yazma bilmeden ilgili değildi, ama yüzünden. (Ayrıca " mkdir -p" için arama yaparak bulunabilecek belirli dizin yapıları oluşturma hakkında birçok sorumuz var .)
Eliah Kagan 10:18

Yanıtlar:


25

İle mkdir, printfve bash en ayracı genişleme:

$ 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}genişler A B ... Z,
  • printf "%s/"argümanları /ardına ile yazdırır , böyleceA/B/...Z/
  • ve dizini, mkdir -poluşturulması A/B/.../Zgereken üst dizinlerle oluşturur.

bunun için teşekkürler. Bu hatayı alırken düşündüm. Mkdir komutunu kullanıyorum: 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: Böyle bir dosya veya dizin yok
Nish

3
@Nish bir var -piçinde mkdirkomuta.
muru

benim kötü, ben ubuntu yerine benim mac üzerinde denedim. Ve bir takip sorusu bu -> diyelim ki A içinde A1..A100 dizinine sahip olmak istedim (aynı yapıda AtoZ). Sonra B1.B100 B içinde. Yani böyle bir şey görünüyor -> imgur.com/jfuKEdf
Nish

11
Diyelim ki izlemeyi yorumlar yerine gerçek bir soru olarak yayınladınız ve resimlerden başka metin kullanmadınız. Bu çok daha iyi olurdu, değil mi?
muru

Burada ne demek istediğini anlıyorum. Onun değil bir kod olarak göndermek zor ve onun bir hugeass çıktı. Dolayısıyla, ekran görüntüsüne bakmak anlaşılmasını kolaylaştırır.
Nish

7

Çok basit bir düzeyde, {A..Z}tüm harfi oluşturmak için genişletmeyi kullanabilir , ardından her birini tekrarlı olarak yapabilir ve girebilirsiniz:

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

Hızlı çıkışımda görebileceğiniz gibi, artık tamamen zincirlenmiş bir dizin var.

Ancak, gerçek dizin adları sadece alfabeden farklıysa, bir şekilde yinelediğiniz ve aynı işlemi tekrarladığınız bir dosya aracılığıyla dizin adlarının listesini bir şekilde sağlamanız gerekir. Temel olarak, bu

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

bu oldukça havalı. İşte bir takip sorusu. Diyelim ki A içinde A1..A100 dizinine sahip olmak istedim (aynı yapıda AtoZ). Sonra B1..B100 B içinde. Yani böyle bir şey görünüyor -> imgur.com/jfuKEdf
Nish

@Nish ah, bu yüzden bir iç döngü gerektirirfor d in {A..Z}; do mkdir "$d"; cd "$d"; for i in {1..100}; do mkdir "${d}${i}" ;done ; done
Sergiy Kolodyazhnyy

Veya iç döngü olmadan,for d in {A..Z}; do mkdir "$d"; cd "$d"; mkdir "$d"{1..100}; done
Sergiy Kolodyazhnyy

bunun için teşekkürler. Çalışıyor gibi görünüyor ama dizinin sırası berbat görünüyor 2 böylece 1 sonra değil. Rasgele sıralanır. Bunu düzeltmek için neyse? İşte bir ekran görüntüsü -> imgur.com/a/Zqj1c
Nish

@Nish Sıralama düzeni metin tabanlı, beklediğiniz gibi sayısal değil. Bildiğim kadarıyla tree, bunu nasıl düzeltebileceğimden emin değilim, ama bence bu bir treeproblem değil, daha çok kabuğun sıralama düzeni olabilir. Burada ya da daha iyi hakkında gerçek soru sormayı öneririm henüz unix.stackexchange.com
Sergiy Kolodyazhnyy

2

Olsa MURU en printfyolu , ben şahsen böyle yendi olamaz jotbu tür bir şey için. jotUbuntu'ya varsayılan olarak yüklenmez. athena-jotPaket bunu sağlar. Bu komutlardan biri çalışır:

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

Çıkış sonra geçirilen çünkü Gerçekten harf dizinine üretir ve eğik çizgiler ile bunları birleştiren herhangi bir komut, bu kolaylaştıracaktır mkdir -paracılığıyla ya komut ikamesi (olduğu gibi MURU cevabı ) ya da kullanan xargs. Birkaç araç kullanan ve xargsbelki de çok az sistem veya Ubuntu Core dışında yazılım yüklemenizi gerektirmeyen bazı örnekler :

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

Eski Ubuntu sürümleri sadece değiştirmek, Python 2 yerine Bunun için Python 3. gelmek python3için pythongerçekten Python ile bunu istiyorum, bu son komut çalışması için.

Benzer şekilde, muru'nun kısa ve basit yolu alternatif olarak yazılabilir:

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

Sondaki /, dizin yolu içinde mkdir -poluşturmak istenir, sorun yok ve belki üslup tercih edilir. Ancak bu cevabın diğer örneklerinde olduğu gibi bunu atlamakta fayda var.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.