2009-11-13 99 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