Bash中的命令行工具来构建目录树?

时间:2016-03-30 07:22:56

标签: bash shell scripting directory

我有一个bash脚本,它将模板文件和数据混合在一起,分层放置在名为INPUT的目录中。

该脚本执行以下操作:

  1. 创建分层文件输出结构OUTPUT
  2. 使用过滤/后处理数据填充所述文件树。
  3. 在所述数据上运行一些外部程序以进行可视化等。
  4. 由于我希望这个脚本尽可能便携并且让同事们可以轻松运行它,我不想在外部预先制作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,这样我就可以在一个命令中获得一个变量赋值,以便以后重用。)

1 个答案:

答案 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