【问题标题】:Command Line Tool in Bash to Build Directory Tree?Bash 中用于构建目录树的命令行工具?
【发布时间】:2016-07-18 01:32:16
【问题描述】:

我有一个 bash 脚本,它混合了模板文件和数据,这些模板文件和数据分层排列在名为 INPUT 的目录中。

脚本执行以下操作:

  1. 创建分层文件输出结构,OUTPUT
  2. 使用过滤/后处理数据填充所述文件树。
  3. 在所述数据上运行一些用于可视化等的外部程序。

由于我希望此脚本尽可能便携并便于同事运行,我不想在外部预先制作 OUTPUT 文件夹结构,我想动态生成它。

不幸的是,这会创建一个大文本球。

目前我有类似的东西:

$!/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,这样我就可以在一个命令中获得变量赋值,以便以后重用。)

【问题讨论】:

  • 不幸的是,我认为没有任何其他工具可以让它变得更简单。如果您正在动态创建,我看到的唯一其他选项是一些方案,您将生成的路径组件保存在一个数组(或者可能是一个关联数组)中,然后您可以在某些循环方案中使用它来创建 dir 结构当您有需要的数据。老实说,这听起来没什么好处,但它可能会根据您的最终循环逻辑(或使其变得更糟......)来整理事情。祝你好运。
  • 关闭你可以得到mkdir -p $(pwd)/OUTPUT/TOP1/MID1_{1,2,3} $(pwd)/OUTPUT/TOP2 $(pwd)/OUTPUT/TOP3/MID1_{1,2}
  • 啊,这很聪明/很方便@7171u!你能不能把它变成一个解决方案。它让我足够接近我可以解决其余部分的地方......我想给你荣誉。

标签: bash shell scripting directory


【解决方案1】:

有一个参数扩展列出了所有带有前缀的变量名称:

${!prefix@}

如果我们将使用的变量的名称更改为某种统一格式,并按照需要创建的顺序对其进行排序,这将解决您的问题:

#!/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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多