Автоматизований спосіб створення дерева каталогів


11

Я намагаюся зробити дерево каталогів від А до Я, де наступний каталог знаходиться в поточному каталозі.

Наприклад: B знаходиться в межах A, а C - у межах B тощо.

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

Будь-які підказки про те, як це зробити автоматизованим способом?


Цікаво, яке практичне призначення таких каталогів. IMHO це більше схоже на питання для Code Golf .
Мелебій

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/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: Такого файлу чи каталогу немає
Ніш

3
@Nish Там є -pв mkdirкоманді.
муру

мені погано, я спробував це на своєму mac замість ubuntu. І наступне питання таке -> скажімо, я хотів мати каталог A1..A100 в межах A (у тій же структурі AtoZ). Тоді B1..B100 в межах B. Так виглядає приблизно так -> imgur.com/jfuKEdf
Ніш

11
Скажімо, ви подали подальше запитання як фактичне запитання замість коментарів і використовували не зображення, а текст. Це було б набагато краще, ні?
муру

Я розумію тут ваш пункт. Його важко розмістити як його не код, а величезний вихід при цьому. Тому просто перегляд скріншота полегшує розуміння.
Ніш

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
Сергій Колодяжний

Або навіть без внутрішньої петлі,for d in {A..Z}; do mkdir "$d"; cd "$d"; mkdir "$d"{1..100}; done
Сергій Колодяжний

Дякую за це. Здається, працює, але порядок каталогів, здається, накручений, так що 2 не після 1. Її відсортовано випадковим чином. Все одно, щоб це виправити? Ось знімок екрана -> imgur.com/a/Zqj1c
Ніш

@Nish Порядок сортування є текстовим, а не числовим, як я думаю, що ви очікуєте. Наскільки treeя не впевнений, як це виправити, але думаю, це може бути навіть не treeпроблемою, а скоріше порядком сортування оболонки. Я б запропонував задати актуальне запитання про це або тут, або ще краще на unix.stackexchange.com
Сергій Колодяжний

2

Незважаючи на те , що printfдорогу Муру не подолати , мені особисто подобається jotтака річ. jotне встановлено за замовчуванням в Ubuntu. athena-jotПакет забезпечує його. Будь-яка з цих команд працює:

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

Дійсно, будь-яка команда, яка генерує послідовність букв і з'єднує їх з косою рискою, полегшить це, оскільки її вихід може бути переданий mkdir -pабо через заміну команд (як у відповіді Муру ), або за допомогою 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

Старі версії Ubuntu поставляються з Python 2 замість Python 3. Для цього просто змініть python3на, pythonщоб остання команда працювала, якщо ви дійсно хочете зробити це з Python.

Аналогічно короткий і простий спосіб Муру можна також записати:

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

Очевидно /, що в шляху до каталогу mkdir -pзадається створення, це не є проблемою і, мабуть, стилістично кращим. Але добре це опустити, як це роблять інші приклади цієї відповіді.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.