Как рекурсивно создавать несуществующие подкаталоги с помощью Bash?

Asked
Viewd99202

194

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

 [ -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"
 
  • http://unix.stackexchange.com/questions/49263/recursive-mkdir

    Ciro Santilli 郝海东冠状病六四事件法轮功16 августа 2016, 16:59

4 ответов

436

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

-p, --parents

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

Итак:

 mkdir -p "$BACKUP_DIR/$client/$year/$month/$day"
 
  • Проголосовали за вас, потому что вы сторонник удаления.Ой, уже год назад!

    Aaron Hall03 февраля 2015, 21:50
  • Не работает, если пользователь не имеет права читать одну из периодически появляющихся папок

    TheKitMurkit22 апреля 2018, 08:11
  • alias mkdirs=mkdir -p

    dr jerry24 июля 2018, 19:23
  • @bmargulies - Чёрт возьми, это было намного проще, чем я думал = P

    Topher Fangio13 ноября 2009, 20:48
0
 mkdir -p newDir/subdir{1..8}
ls newDir/
subdir1 subdir2 subdir3 subdir4 subdir5 subdir6 subdir7 subdir8
 
14

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

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

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

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

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

  • Я согласен с @ DavidC.Rankin.Этот ответ идеален IMHO, но он требует объяснения того, что на самом деле делает скобка.

    Delali09 декабря 2018, 15:44
  • Вы можете объяснить, что такое {...,...} в bash и почему то, что вы делаете, имеет смысл.Краткое объяснение расширения скобок было бы полезно для других пользователей.Фраза «ты можешь сделать это» и получить «это» оставляет немного места для воображения.

    David C. Rankin22 декабря 2017, 05:43
67
 $ mkdir -p "$BACKUP_DIR/$client/$year/$month/$day"