【问题标题】:How can I create nonexistent subdirectories recursively using Bash?如何使用 Bash 递归地创建不存在的子目录?
【发布时间】:2010-12-16 10:47:00
【问题描述】:

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

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

【问题讨论】:

标签: bash shell recursion subdirectory


【解决方案1】:

可以使用-p参数,即documented as

-p,--父母

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

所以:

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

【讨论】:

  • @bmargulies - 比我想象的要简单得多的废话 =P
  • 赞成,因为您是删除者。糟糕,大约一年前就已经这样做了!
  • 如果用户无权读取间歇性文件夹之一则不起作用
  • alias mkdirs=mkdir -p
  • 有没有办法递归设置权限?
【解决方案2】:
mkdir -p "$BACKUP_DIR/$client/$year/$month/$day"

【讨论】:

    【解决方案3】:

    虽然现有答案肯定能解决问题,但如果您希望在两个不同的子目录下复制嵌套目录结构,那么您可以这样做:

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

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

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

    该示例取自this link,用于创建SBT 目录结构。

    【讨论】:

    • 您可能想解释一下{...,...} 在 bash 中的含义以及为什么您所做的事情是有意义的。 大括号扩展 的简短解释将对其他用户有益。一句“你能做到”,得到“这个”,就有点想象空间了。
    • 我同意@DavidC.Rankin。这个答案是完美的恕我直言,但它需要解释括号符号的实际作用。
    【解决方案4】:
    mkdir -p newDir/subdir{1..8}
    ls newDir/
    subdir1 subdir2 subdir3 subdir4 subdir5 subdir6 subdir7 subdir8
    

    【讨论】:

    • 这只会在newDir/中创建8个子目录。
    猜你喜欢
    • 2016-10-23
    • 2017-09-12
    • 2011-04-10
    • 1970-01-01
    • 2016-08-13
    • 2011-10-10
    • 2011-09-08
    • 2012-07-31
    相关资源
    最近更新 更多