Как создать несуществующие подкаталоги рекурсивно, используя 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"
Topher Fangio
источник
3
unix.stackexchange.com/questions/49263/recursive-mkdir
Чиро Сантилли 郝海东 '病 六四 事件 法轮功

Ответы:

431

Вы можете использовать -pпараметр, который задокументирован как :

-p, --parents

без ошибок, если есть, создайте родительские каталоги по мере необходимости

Так:

mkdir -p "$BACKUP_DIR/$client/$year/$month/$day"
bmargulies
источник
30
@bmargulies - Святое дерьмо, которое оказалось намного проще, чем я думал = P
Topher Fangio
Проголосовал, потому что ты делеционист. Ой, уже сделал около года назад!
Аарон Холл
Это не работает, если пользователь не имеет права читать одну из непостоянных папок
TheKitMurkit
2
alias mkdirs=mkdir -p
Др Джерри
67
$ mkdir -p "$BACKUP_DIR/$client/$year/$month/$day"
Джонатан Фейнберг
источник
14

Хотя существующие ответы определенно решают задачу, если вы хотите скопировать структуру вложенных каталогов в двух разных подкаталогах, вы можете сделать это

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

Это создаст следующую структуру каталогов под каталогом, откуда он вызывается

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

Пример взят из этой ссылки для создания структуры каталогов SBT

y2k-Shubham
источник
9
Вы можете объяснить, что {...,...}в bash и почему то, что вы делаете, имеет смысл. Краткое объяснение расширения скобок будет полезно для других пользователей. «Вы можете сделать это» и получить «это» оставляет немного воображения.
Дэвид С. Рэнкин
Я согласен с @ DavidC.Rankin. Этот ответ идеально подходит ИМХО, но он должен объяснить, что на самом деле делает скобочная запись.
Делали
0
mkdir -p newDir/subdir{1..8}
ls newDir/
subdir1 subdir2 subdir3 subdir4 subdir5 subdir6 subdir7 subdir8
nitrohuffer2001
источник
Это просто создаст 8 подкаталогов в newDir/.
csabinho