Cách tự động để tạo cây thư mục


11

Tôi đang cố gắng tạo một cây thư mục từ A đến Z trong đó thư mục tiếp theo nằm trong thư mục hiện tại.

Ví dụ: B nằm trong A và C nằm trong B và cứ thế ..

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

Bất kỳ manh mối nào về cách làm cho nó được thực hiện theo cách tự động?


Tôi tự hỏi mục đích thực tế của các thư mục như vậy là gì. IMHO điều này trông giống như một câu hỏi cho Code Golf .
Melebius

3
@Melebius Một mục đích có thể là tạo cấu trúc thư mục như một trường hợp thử nghiệm, để giúp xác minh rằng một số thuộc tính lệnh, tập lệnh hoặc ứng dụng khác hoạt động. Đây là một ví dụ gần đây , nơi câu hỏi không phải là về việc tạo các cấu trúc thư mục cụ thể, nhưng biết cách viết lệnh để làm như vậy rất hữu ích cho mục đích thử nghiệm, không phải mặc dù cấu trúc cụ thể bị chiếm đoạt và kỳ lạ, nhưng vì nó. (Chúng tôi cũng có nhiều câu hỏi về việc tạo cấu trúc thư mục cụ thể, có thể tìm thấy bằng cách tìm kiếm " mkdir -p".)
Eliah Kagan

Câu trả lời:


25

Với mkdir, printfvà mở rộng cú đúp của 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}mở rộng đến A B ... Z,
  • printf "%s/"in các đối số với một /sau chúng, vì vậy tôi nhận đượcA/B/...Z/
  • mkdir -ptạo A/B/.../Zthư mục với bất kỳ thư mục mẹ nào cần tạo.

cảm ơn vì điều đó. Nghĩ rằng tôi nhận được lỗi này trong khi. Tôi sử dụng lệnh 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: Không có tệp hoặc thư mục như vậy
Nish

3
@Nish Có một -ptrong các mkdirlệnh.
muru

xấu của tôi, tôi đã thử nó trên mac của tôi thay vì ubfox. Và một câu hỏi tiếp theo là đây -> giả sử tôi muốn có thư mục A1..A100 trong A (trong cùng cấu trúc AtoZ). Sau đó là B1..B100 trong B. Vì vậy, nó trông giống như thế này -> imgur.com/jfuKEdf
Nish

11
Giả sử bạn đăng bài tiếp theo dưới dạng câu hỏi thực tế thay vì trong các bình luận và không sử dụng hình ảnh mà chỉ là văn bản. Điều đó sẽ tốt hơn nhiều, phải không?
muru

Tôi hiểu quan điểm của bạn ở đây. Thật khó để gửi nó vì nó không phải là một mã và đầu ra của nó ở đó. Vì vậy, chỉ cần nhìn vào ảnh chụp màn hình làm cho nó dễ hiểu hơn.
Nish

7

Ở mức độ rất đơn giản, bạn có thể sử dụng {A..Z}mở rộng để tạo tất cả các chữ cái, sau đó lặp đi lặp lại và nhập từng chữ cái:

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

Như bạn có thể thấy trong đầu ra nhanh chóng của tôi, bây giờ bạn có thư mục hoàn toàn xích.

Tuy nhiên, nếu tên thư mục thực tế khác với chỉ bảng chữ cái, bằng cách nào đó bạn sẽ phải cung cấp danh sách tên thư mục, có thể thông qua một tệp, qua đó bạn lặp lại và thực hiện lại quy trình. Về cơ bản, cái này

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

đó là khá mát mẻ. Đây là một câu hỏi tiếp theo. giả sử tôi muốn có thư mục A1..A100 trong A (trong cùng cấu trúc AtoZ). Sau đó là B1..B100 trong B. Vì vậy, nó trông giống như thế này -> imgur.com/jfuKEdf
Nish

@Nish ah, điều đó đòi hỏi một vòng lặp bên trong vậyfor d in {A..Z}; do mkdir "$d"; cd "$d"; for i in {1..100}; do mkdir "${d}${i}" ;done ; done
Sergiy Kolodyazhnyy

Hoặc thậm chí không có vòng lặp bên trong,for d in {A..Z}; do mkdir "$d"; cd "$d"; mkdir "$d"{1..100}; done
Sergiy Kolodyazhnyy

cảm ơn vì điều đó. Nó có vẻ hoạt động nhưng thứ tự của thư mục dường như bị sai lệch vì vậy 2 không phải sau 1. Nó được sắp xếp ngẫu nhiên. Dù sao để khắc phục điều đó? Đây là một ảnh chụp màn hình -> imgur.com/a/Zqj1c
Nish

Thứ tự sắp xếp @Nish dựa trên văn bản, không phải là số như tôi nghĩ bạn mong đợi. Theo như treetôi không chắc chắn làm thế nào để khắc phục điều đó, nhưng tôi nghĩ rằng điều này thậm chí có thể không phải treelà vấn đề, mà là thứ tự sắp xếp của shell. Tôi khuyên bạn nên đặt câu hỏi thực tế về vấn đề đó ở đây hoặc tốt hơn trên unix.stackexchange.com
Sergiy Kolodyazhnyy

2

Mặc dù cách của muruprintf không thể đánh bại, cá nhân tôi thích kiểu jotnày. jotkhông được cài đặt theo mặc định trong Ubuntu. Các athena-jotgói cung cấp nó. Một trong hai lệnh này hoạt động:

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

Thực sự bất kỳ lệnh nào tạo ra chuỗi các chữ cái và nối chúng bằng dấu gạch chéo sẽ tạo điều kiện thuận lợi cho việc này, bởi vì đầu ra của nó sau đó có thể được chuyển qua mkdir -phoặc thay thế lệnh (như trong câu trả lời của muru ) hoặc sử dụng xargs. Dưới đây là một số ví dụ sử dụng một vài công cụ và xargskhông yêu cầu bạn cài đặt phần mềm, ngoại trừ có lẽ trên các hệ thống rất nhỏ hoặc 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

Phiên bản cũ Ubuntu đi kèm với Python 2 thay vì Python 3. Cho rằng, chỉ cần thay đổi python3để pythonlàm cho rằng công việc lệnh cuối cùng, nếu bạn thực sự muốn làm điều này với Python.

Tương tự, cách ngắn và đơn giản của muru có thể được viết thay thế:

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

Các trailing /, trong đường dẫn thư mục mkdir -pđược yêu cầu tạo, không có vấn đề gì và được cho là thích hợp hơn về mặt phong cách. Nhưng sẽ tốt hơn nếu bỏ qua nó, như các ví dụ khác trong câu trả lời này làm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.