我想基于大括号扩展名(例如{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
但是我该怎么走?
答案 0 :(得分:1)
递归解决方案。用2个参数调用Job: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
答案 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>
。