Как создать несуществующие подкаталоги рекурсивно, используя Bash? - PullRequest
164 голосов
/ 13 ноября 2009

Я создаю скрипт быстрого резервного копирования, который будет выгружать некоторые базы данных в красивую / аккуратную структуру каталогов, и я понял, что мне нужно проверить, чтобы убедиться, что каталоги существуют, прежде чем я их создаю. Код у меня работает, но кажется, что есть лучший способ сделать это. Есть предложения?

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

392 голосов
/ 13 ноября 2009

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

-p, --parents

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

Итак:

mkdir -p "$BACKUP_DIR/$client/$year/$month/$day"
64 голосов
/ 13 ноября 2009
$ mkdir -p "$BACKUP_DIR/$client/$year/$month/$day"
8 голосов
/ 22 декабря 2017

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

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

Он создаст следующую структуру каталогов в каталоге, из которого он вызывается

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

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

...