2009-11-13 59 views
133

我正在创建一个快速备份脚本,将一些数据库转储到一个漂亮/整洁的目录结构中,并且我意识到我需要测试以确保目录在创建之前存在。代码我有工作,但似乎有更好的方法来做到这一点。有什么建议么?如何使用Bash递归创建不存在的子目录?

[ -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" 
+1

http://unix.stackexchange.com/questions/49263/recursive-mkdir – 2016-08-16 16:59:02

回答

340

可以使用-p参数,这是documented as:如果现有

-p,--parents

没有错误,使父目录需要

所以:

mkdir -p "$BACKUP_DIR/$client/$year/$month/$day" 
+26

@bmargulies - 神圣的废话比我想象的要简单得多= P – 2009-11-13 20:48:53

+0

Upvoted因为你是一个删除者。糟糕,大约一年前已经做了!示例中使用的是+ 1 + – 2015-02-03 21:50:37

61
$ mkdir -p "$BACKUP_DIR/$client/$year/$month/$day" 
+8

+1。 – mskfisher 2010-02-12 16:03:24

1

尽管现有的答案肯定解决的目的,如果傻冒找下的两个不同的子目录复制的嵌套目录结构,那么你就可以做到这一点

mkdir -p {main,test}/{resources,scala/com/company} 

它将在该目录下创建以下目录结构从那里它被调用

├── main 
│   ├── resources 
│   └── scala 
│    └── com 
│     └── company 
└── test 
    ├── resources 
    └── scala 
     └── com 
      └── company 

的例子是从this link采取用于创建SBT目录结构

+2

你可能想解释什么是“{...,...}”,为什么你的做法是有道理的。 *大括号扩展*的简短说明会对其他用户有所帮助。一个“你可以做到这一点”,并得到“这”离开了想象。 – 2017-12-22 05:43:56