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

232

我正在创建一个快速备份脚本,将一些数据库转储到一个漂亮/整洁的目录结构中,我意识到在创建它们之前需要测试确保目录存在。我的代码可以工作,但有更好的方法吗?

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

3
http://unix.stackexchange.com/questions/49263/recursive-mkdir - Ciro Santilli OurBigBook.com
4个回答

514

您可以使用-p参数,它在文档中有记录

-p,--parents

如果存在,则不报错,如有需要则创建父级目录

因此:

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

37
@bmargulies - 天啊,那比我想象中的简单多了 =P - Topher Fangio
因为你是一个删除主义者,所以我点了赞。哎呀,我已经在一年前做过了! - Russia Must Remove Putin
1
如果用户没有读取其中一个间歇性文件夹的权限,则无法正常工作。 - TheKitMurkit
5
别名 mkdirsmkdir -p 命令与之关联。 - dr jerry
有没有一种递归设置权限的方法? - Saeed Neamati
@saeed-neamati chmod -R - Meow Kim

73
mkdir -p "$BACKUP_DIR/$client/$year/$month/$day"

26

虽然现有的答案确实解决了问题,但如果您想要在两个不同的子目录下复制嵌套目录结构,则可以这样做:

现有的答案虽然能够解决问题,但如果您需要在两个不同的子目录下复制嵌套目录结构,则可以采用以下方法:

mkdir -p {main,test}/{resources,scala/com/company}
它将在调用它的目录下创建以下目录结构:
├── main
│   ├── resources
│   └── scala
│       └── com
│           └── company
└── test
    ├── resources
    └── scala
        └── com
            └── company

这个例子来自这个链接,用于创建一个SBT目录结构。


11
你可能需要解释一下在bash中 {...,...} 的含义,并说明你正在做什么是有意义的。简要介绍一下“花括号扩展”的概念,这对其他用户可能会有帮助。“你可以这样做”并获取“这个结果”留给读者想象空间较大。{...,...} 是 bash 中的 花括号扩展,可以用来生成多个字符串或数字的序列。例如,{1,2,3} 可以扩展成字符串 "1"、"2" 和 "3",而 {a..c} 则可以扩展成字符串 "a"、"b" 和 "c"。使用花括号扩展可以方便地生成许多相关的字符串或数字,从而使脚本编写更加高效。如果你想展示如何使用它,最好提供一个具体的例子,以便读者更好地理解。 - David C. Rankin
我同意@DavidC.Rankin的观点。在我看来,这个答案是完美的,但需要解释一下括号表示法实际上是做什么的。 - Delali

0
mkdir -p newDir/subdir{1..8}
ls newDir/
subdir1 subdir2 subdir3 subdir4 subdir5 subdir6 subdir7 subdir8

这将在 newDir/ 中创建8个子目录。 - csabinho

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