如何使用Bash递归创建不存在的子目录?

Top*_*gio 173 bash shell recursion subdirectory

我正在创建一个快速备份脚本,将一些数据库转储到一个漂亮/整洁的目录结构中,我意识到我需要测试以确保在创建目录之前存在这些目录.我的代码有效,但似乎有更好的方法.有什么建议?

[ -d "$BACKUP_DIR" ] || mkdir "$BACKUP_DIR"
[ -d "$BACKUP_DIR/$client" ] || mkdir "$BACKUP_DIR/$client"
[ -d "$BACKUP_DIR/$client/$year" ] || mkdir "$BACKUP_DIR/$client/$year"
[ -d "$BACKUP_DIR/$client/$year/$month" ] || mkdir "$BACKUP_DIR/$client/$year/$month"
[ -d "$BACKUP_DIR/$client/$year/$month/$day" ] || mkdir "$BACKUP_DIR/$client/$year/$month/$day"
Run Code Online (Sandbox Code Playgroud)

bma*_*ies 407

您可以使用-p参数,该文件记录为:

-p, - 父母

如果存在则没有错误,根据需要创建父目录

所以:

mkdir -p "$BACKUP_DIR/$client/$year/$month/$day"
Run Code Online (Sandbox Code Playgroud)

  • @bmargulies - 比我想象的更简单的神圣废话= P. (29认同)
  • `别名 mkdirs=mkdir -p` (4认同)

Jon*_*erg 64

$ mkdir -p "$BACKUP_DIR/$client/$year/$month/$day"
Run Code Online (Sandbox Code Playgroud)


y2k*_*ham 9

虽然现有的答案肯定会解决目的,如果你想要在两个不同的子目录下复制嵌套目录结构,那么你可以这样做

mkdir -p {main,test}/{resources,scala/com/company}
Run Code Online (Sandbox Code Playgroud)

它将在调用它的目录下创建以下目录结构

??? main
?   ??? resources
?   ??? scala
?       ??? com
?           ??? company
??? test
    ??? resources
    ??? scala
        ??? com
            ??? company
Run Code Online (Sandbox Code Playgroud)

该示例来自此链接以创建SBT目录结构

  • 你可能想解释什么是`{...,...}`在bash中以及为什么你的行为有意义.*大括号扩展*的简短解释将有益于其他用户.一个"你可以做到这一点"并得到"这个"留下一点想象力. (7认同)