Como criar subdiretórios inexistentes recursivamente usando o Bash?

191

Estou criando um script de backup rápido que despejará alguns bancos de dados em uma estrutura de diretórios agradável / legal e percebi que preciso testar para garantir que os diretórios existam antes de criá-los. O código que tenho funciona, mas parece que existe uma maneira melhor de fazê-lo. Alguma sugestão?

[ -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
fonte
3
unix.stackexchange.com/questions/49263/recursive-mkdir
Ciro Santilli foi adicionado em

Respostas:

430

Você pode usar o -pparâmetro, que está documentado como :

-p, --parents

se houver erro, crie os diretórios pai conforme necessário

Assim:

mkdir -p "$BACKUP_DIR/$client/$year/$month/$day"
bmargulies
fonte
30
@bmargulies - Santo porcaria que era a maneira mais simples do que eu pensava = P
Topher Fangio
Promovido porque você é um delecionista. Opa, já fiz cerca de um ano atrás!
Aaron Hall
Ele não funciona se o usuário não tem o direito de ler uma das pastas intermitentes
TheKitMurkit
1
alias mkdirs=mkdir -p
dr jerry
67
$ mkdir -p "$BACKUP_DIR/$client/$year/$month/$day"
Jonathan Feinberg
fonte
14

Embora as respostas existentes resolvam definitivamente o objetivo, se você deseja replicar a estrutura de diretórios aninhados em dois subdiretórios diferentes, você pode fazer isso

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

Ele criará a seguinte estrutura de diretório no diretório de onde é chamada

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

O exemplo foi retirado deste link para criar a estrutura de diretórios do SBT

y2k-shubham
fonte
9
Você pode explicar o que {...,...} está no bash e por que o que você faz faz sentido. Uma breve explicação da expansão da cinta seria benéfica para outros usuários. Um "você pode fazer isso" e obter "isso" deixa um pouco para a imaginação.
David C. Rankin
Eu concordo com @ DavidC.Rankin. Esta resposta é IMHO perfeita, mas precisa explicar o que a notação de colchete realmente faz.
Delali
0
mkdir -p newDir/subdir{1..8}
ls newDir/
subdir1 subdir2 subdir3 subdir4 subdir5 subdir6 subdir7 subdir8
nitrohuffer2001
fonte
Isso criará apenas 8 subdiretórios no newDir/.
csabinho 24/10/19