递归创建所有字母的目录

时间:2019-03-28 10:19:58

标签: bash recursion directory

我想基于大括号扩展名(例如{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 个答案:

答案 0 :(得分:1)

递归解决方案。用2个参数调用Job:max_depthbase_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

答案 1 :(得分:1)

最简单的形式是使用以下任何一行:

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生成完整的brace-expansion-string,并在将其传递到exec之前使用mkdir -p处理brace-expansion-string:

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

但是请注意,如果您的集合长度为m,并且您希望深度为n,那么您正在创建m^n目录。此数字可能与您可以传递给程序的参数数量发生冲突。

相关信息:

答案 2 :(得分:0)

递归函数可以解决您的问题。使用高目录级别时,请小心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>