我有一个bash脚本,它将模板文件和数据混合在一起,分层放置在名为INPUT
的目录中。
该脚本执行以下操作:
OUTPUT
由于我希望这个脚本尽可能便携并且让同事们可以轻松运行它,我不想在外部预先制作OUTPUT
文件夹结构,我想在运行时生成它。
不幸的是,这会创建一个大文本glob。
目前我有类似的东西:
$!/bin/bash
function MkdirAndAssign() { mkdir -p $1; echo $1; }
baseDir=$( pwd )
outDir=$( MkdirAndAssign ${baseDir}/OUTPUT )
outTop1Dir=$( MkdirAndAssign ${outDir}/TOP1 )
outMid1_1Dir=$( MkdirAndAssign ${outTop1Dir}/MID1_1 )
outMid1_2Dir=$( MkdirAndAssign ${outTop1Dir}/MID1_2 )
outMid1_3Dir=$( MkdirAndAssign ${outTop1Dir}/MID1_3 )
outBottom1_3_1Dir=$( MkdirAndAssign ${outMid1_3Dir} )
outTop2Dir=$( MkdirAndAssign ${outDir}/TOP2 )
outTop3Dir=$( MkdirAndAssign ${outDir}/TOP3 )
outMid3_1Dir=$( MkdirAndAssign ${outTop1Dir}/MID3_1 )
outMid3_2Dir=$( MkdirAndAssign ${outTop1Dir}/MID3_2 )
当然这些只是组成了目录名......我的真实意义......但关键是我正在构建这一大套嵌套目录。
我的问题:
是否有某种shell命令可以使它更短更甜?
(注意我的函数基本上只包装mkdir -p
,这样我就可以在一个命令中获得一个变量赋值,以便以后重用。)
答案 0 :(得分:1)
有一个参数扩展,列出了具有一些预添加的变量的所有名称:
${!preffix@}
如果我们将变量的名称更改为某种统一格式,并按照需要创建的顺序对它们进行排序,这将解决您的问题:
#!/bin/bash
outDir=$( pwd )
outDir01=${outDir}/OUTPUT
outDir02=${outDir01}/TOP1
outDir03=${outDir02}/MID1_1
outDir04=${outDir02}/MID1_2
outDir05=${outDir02}/MID1_3
outDir06=${outDir05}/BOT_1
outDir07=${outDir01}/TOP2
outDir08=${outDir01}/TOP3
outDir09=${outDir02}/MID3_1
outDir10=${outDir02}/MID3_2
for d in "${!outDir@}"; do
[[ $d == outDir ]] && continue
if [[ -e "${!d}" ]]; then
[[ -f "${!d}" ]] && echo "A file named ${!d} exist"
[[ -d "${!d}" ]] && echo "A directory named ${!d} already exist"
exit 2
else
echo \
mkdir "${!d}"
if [[ $? != 0 ]]; then
echo "mkdir was unable to create ${!d}"
exit 3
fi
fi
done
该脚本有一个echo \
供您查看它的功能。如果您同意列出的操作,请注释掉该行(添加#
:# echo \
)。
但是,最简单的方法是(但更难维护):
$ mkdir -p ./OUTPUT/TOP{1/MID{1_{1,2,3/BOT_1},3_{1,2}},2,3}
$ tree OUTPUT/
OUTPUT/
├── TOP1
│ ├── MID1_1
│ ├── MID1_2
│ ├── MID1_3
│ │ └── BOT_1
│ ├── MID3_1
│ └── MID3_2
├── TOP2
└── TOP3