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


191

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

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

Answers:


430

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

-p,-父母

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

所以:

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

30
@bmargulies-比我想象的要简单的废话= P
Topher Fangio

由于您是删除主义者而被投票。糟糕,已经大约一年前了!
亚伦·霍尔

如果用户无权读取其中一个间歇性文件夹
则将

1
alias mkdirs=mkdir -p
jerry博士


14

尽管现有答案肯定可以解决问题,但是如果您希望在两个不同的子目录下复制嵌套目录结构,则可以执行此操作

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

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

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

该示例来自此链接,用于创建SBT目录结构


9
您可能想解释一下{...,...}bash中的内容以及为什么您的操作有意义。括号扩展的简短说明将对其他用户有益。一个“您可以做到”并获得“这个”,这让想象力有了一点点。
David C. Rankin

我同意@ DavidC.Rankin。这个答案是完美的恕我直言,但需要解释括号符号的实际作用。
德拉利(Dalali)'18

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

这只会在中创建8个子目录newDir/
csabinho
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.