Рекурсивно создавать каталоги для всех писем - PullRequest
0 голосов
/ 28 марта 2019

Я хотел бы создать структуру папок, основанную на расширении скобки, например {a-z}.Каждая строка, сгенерированная расширением скобки, должна быть новой папкой.Кроме того, каждая из этих папок должна содержать один и тот же набор подпапок, сгенерированных одинаково.И это до заданного уровня.

Пример для диапазона a-z и глубины 16

a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/
a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/b/
a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/c/
...
d/a/h/r/y/d/s/b/e/y/k/f/o/o/q/c/
...
z/z/z/z/z/z/z/z/z/z/z/z/z/z/z/y/
z/z/z/z/z/z/z/z/z/z/z/z/z/z/z/z/

Следующий код позволяет мне перейти на глубину 2:

for x in {a..z} ; do mkdir -p $x/{a..z} ; done

Но как мне идти дальше?

Ответы [ 3 ]

1 голос
/ 28 марта 2019

Простейшей формой будет использование любой из следующих строк:

mkdir -p {a..c}/{a..c}        # depth 2
mkdir -p {a..c}/{a..c}/{a..c}  # depth 3
mkdir -p {a..c}/{a..c}/{a..c}/{a..c}  # depth 4
...

Расширение скобки будет составлять все комбинации, а mkdir -p позаботится об остальных.

Конечно, вы не хотите вводить это снова и снова для различных наборов.Таким образом, вы можете сгенерировать полную строку расширения скобок с помощью bash и использовать exec для обработки строки расширения скобок перед передачей ее в mkdir -p:

depth=3
set={a..c}
dirs=$(printf "/${set}%.0s" $(seq $depth))
mkdir -p $(eval echo .${dirs})

Однако помните, что если ваш наборимеет длину m, а глубина n, вы создаете каталоги m^n.Это число может конфликтовать с количеством аргументов, которые вы можете передать программе.

Информация, связанная с данной:

1 голос
/ 28 марта 2019

Рекурсивное решение. Работа вызывается с 2 параметрами: max_depth и base_path

#!/bin/bash

function job()
{
    local depth=$(($1-1))
    local path=$2
    local x
    for x in a b c # reduced for test
    do
        mkdir -p "$path/$x"
        ((depth>0)) && job $depth "$path/$x"
    done
}

job 3 ./test

Докажите это с помощью:

find test -type d
0 голосов
/ 28 марта 2019

Рекурсивная функция может решить вашу проблему. Будьте осторожны с генерацией inode при использовании высоких уровней каталогов ...

#!/bin/bash

function createDir {
   mkdir -p $1 && cd $1;

   for x in {a..z} ; do
         local i=$(($2-1))
         [ $i -lt 0 ] && continue;
         createDir $x $i
   done

   cd ..
}

createDir $1 $2

Сохраните в файл, например mkdir.sh, и назовите его: ./mkdir.sh <main_folder> <level>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...