O usomkdir -p é uma maneira simples para a maioria dos sistemas operacionais modernos:
mkdir -p foo/bar/zoo/andsoforth
No entanto, mkdir -pnão é recomendado em muitos manuais. Leia a documentação do GNU makee autoconfsobre problemas com o uso mkdir -p:
Os sistemas de instalação e configuração de plataforma cruzada têm suas próprias alternativasmkdir -p seguras .
CMake para usar na linha de comando do shell:
cmake -E make_directory foo/bar/zoo/andsoforth
Autoconf para usar em script com pré-processamento:
AS_MKDIR_P(foo/bar/zoo/andsoforth)
ou:
AC_PROG_MKDIR_P(foo/bar/zoo/andsoforth)
Mas essas soluções exigem cmakeou autoconf( M4) ferramentas para serem instaladas (e possível pré-processamento)
Você também pode usar o install-shscript com a -dopção:
install-sh -d foo/bar/zoo/andsoforth
Este script é usado por autoconfe automakeprojeto. Eu acho que deve ser a solução mais segura.
Na época, eu estava procurando por uma solução de plataforma cruzada para padrão /bin/shsem dependências, mas não encontrei nenhuma. Portanto, escrevi o próximo script que pode não ser o ideal, mas acho que é compatível com a maioria dos requisitos de plataforma cruzada :
#! /bin/sh
cdirname() # cross platform alternative for 'dirname'
{
# $1 - path
test $# -eq 1 || { echo "Procedure 'cdirname' must have only one parameter. Scripting error."; exit 1; }
echo "$1" | sed -n -e '1p' | sed -e 's#//*#/#g' -e 's#\(.\)/$#\1#' -e 's#^[^/]*$#.#' -e 's#\(.\)/[^/]*$#\1#' -
}
mkd() # cross platform alternative for 'mkdir -p'
{
# $1 - directory to create
test $# -eq 1 || { echo "Function 'mkd' can create only one directory (with it's parent directories)."; exit 1; }
test -d "$1" && return 0
test -d "$(cdirname "$1")" || { mkd "$(cdirname "$1")" || return 1; }
test -d "$1" || { mkdir "$1" || return 1; }
return 0
}
Este script pode ser usado para sistemas antigos, nos quais a opção -pfor mkdirestá ausente.
sedversão multi-plataforma baseada em dirnamefoi adicionada ao código. Ele funciona de maneira semelhante a dirname(correto com caminho /, caminhos apenas com nome de base, caminhos com final /, caminhos com e sem final \n). Esta função não pode funcionar corretamente se o caminho tiver novas linhas ou caracteres inválidos para a localidade atual. Ele também substitui qualquer combinação de /( //, ///) por uma única/
Alterou a linha mkdir "$1" || return 1para test -d "$1" || { mkdir "$1" || return 1; }porque mkdirtermina com erro se o caminho existe e esta verificação é necessária para caminhos que contenham construções como aaa\.(Se aaanão existe, a versão anterior cria aaae tenta criá-la novamente).
Esta versão do mkd não gera um erro se o caminho já existir (mas ainda tem a possibilidade de gerar esse erro na execução paralela) e não pode obter vários diretórios na linha de comando.