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"

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"

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


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


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.