一次性创建完整的目录树

37

我想在Bash脚本中创建一种复杂的目录结构,我之前认为以下命令可以实现:

mkdir -p tmpdir/{trunk/sources/{includes,docs},branches,tags}

那么将创建:

          tmpdir
    ________|______
   |        |      |
branches   tags  trunk
                   |
                 sources
               ____|_____
              |          |
          includes     docs

然而,当我运行我的脚本时,最终出现:

tmpdir
   |
trunk

有没有快速简便的方法来做这件事或者我必须求助于其他途径?

mkdir -p tmpdir/trunk/sources/includes
mkdir -p tmpdir/trunk/sources/docs
mkdir -p tmpdir/branches
mkdir -p tmpdir/tags

1
我刚刚测试了一下,它按照你的要求正常工作。我的版本是mkdir (GNU coreutils) 8.13 - fedorqui
我有种感觉,这与以下问题相同:http://stackoverflow.com/questions/17673337/bash-expand-parameters-from-variable-how - Barmar
3
你确定在shebang(#!)中使用的shell能够执行此操作吗?它是/bin/bash还是指向Debian或Ubuntu中的/bin/dash/bin/sh?如果不是,请将其更改为/bin/bash并再次尝试。 - Grzegorz Żur
最简单的方法是使用 which bash 命令来确定 shebang 后面应该放什么。它会返回你想要的确切字符串。 - SDsolar
2个回答

21

将shebang更改为

#!/bin/bash

为了支持花括号扩展,需要使用bash脚本运行该脚本。

问题在于您正在使用不支持它的shell。 您的/bin/sh没有指向/bin/bash,而是指向类似/bin/dash的东西。

https://wiki.ubuntu.com/DashAsBinSh#A.7B


我在字符串处理时遇到错误后意识到了这一点。尽管我在脚本中有 #!/bin/bash 作为 shebang,但我却愚蠢地使用 sudo sh script 来执行我的脚本。 - James

-3
你可以尝试使用tree来实现这个功能。
sudo apt install tree
tree -d .

这是一个非常棒的工具,可以打印类似控制台的树形目录结构:

├── logstash   
│   ├── afolder
│   ├── bfolder  
│   └── mappings  
├── elastic 
│   └── afolder  
└── reports  
    └── afolder  

https://superuser.com/questions/359723/mac-os-x-equivalent-of-the-ubuntu-tree-command - zloctb
5
我认为问题是要从单个命令/ bash脚本中创建嵌套目录结构。然而,Tree只是提供了现有目录结构的可视化,而并没有真正创建一个新的目录结构。 - qre0ct

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接