Як створити неіснуючі підкаталоги рекурсивно за допомогою 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"

Відповіді:


431

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

-п, --батьки

немає помилок, якщо вони існують, робіть батьківські каталоги за потребою

Так:

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

30
@bmargulies - Святе лайно, що було набагато простіше, ніж я думав = P
Topher Fangio

Оновлено, оскільки ви делеціоніст. На жаль, вже робили рік тому!
Аарон Холл

Це не працює, якщо користувач не має права читати одну з переривчастих папок
TheKitMurkit

1
alias mkdirs=mkdir -p
д-р Джері


14

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

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

Він створить наступну структуру каталогів під каталогом, звідки вона викликається

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

Приклад взятий з цього посилання для створення структури каталогу SBT


9
Ви можете пояснити, що {...,...}в баш і чому те, що ти робиш, має сенс. Коротке пояснення розширення брекетів буде корисним для інших користувачів. А "ти можеш це зробити" і отримати "це" залишає трохи уяви.
Девід К. Ранкін

Я згоден з @ DavidC.Rankin. Ця відповідь є ідеальним IMHO, але для цього потрібно пояснити, що насправді робить позначення дужок.
Делалі

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.