사용mkdir -p
은 대부분의 최신 OS에서 간단한 방법입니다.
mkdir -p foo/bar/zoo/andsoforth
그러나 mkdir -p
많은 매뉴얼에서는 권장하지 않습니다. GNU 사용 make
및 다음 autoconf
사용 문제에 대한 설명서를 읽으십시오 mkdir -p
.
크로스 플랫폼 설치 및 구성 시스템에는 자체 안전한 대안이mkdir -p
있습니다.
쉘 명령 행에서 사용하는 CMake :
cmake -E make_directory foo/bar/zoo/andsoforth
전처리와 함께 스크립트에서 사용할 Autoconf :
AS_MKDIR_P(foo/bar/zoo/andsoforth)
또는:
AC_PROG_MKDIR_P(foo/bar/zoo/andsoforth)
그러나 이러한 솔루션에는 cmake
또는 autoconf
( M4
) 도구를 설치해야합니다 (및 가능한 전처리)
옵션으로 install-sh
스크립트를 사용할 수도 -d
있습니다.
install-sh -d foo/bar/zoo/andsoforth
이 스크립트에 의해 사용되는 autoconf
및 automake
프로젝트. 가장 안전한 솔루션이라고 생각합니다.
당시 나는 표준이 /bin/sh
없는 크로스 플랫폼 솔루션을 찾고 있었지만 찾지 못했습니다. 따라서 이상적이지 않은 다음 스크립트를 작성 했지만 대부분의 크로스 플랫폼 요구 사항을 준수한다고 생각합니다 .
#! /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
}
이 스크립트는 옵션 기존 시스템에 사용할 수 있습니다 -p
에 대한이 mkdir
존재하지 않는다.
sed
코드 기반 크로스 플랫폼 버전 dirname
이 추가되었습니다. dirname
(path로 수정 /
, 기본 이름 만있는 경로, 후행 /
이있는 경로, 후행이 있거나없는 경로)와 유사한 방식으로 작동합니다 \n
. 경로에 줄 바꿈이 있거나 현재 로케일에 대해 일부 유효하지 않은 문자가 있으면이 기능이 올바르게 작동하지 않습니다. 또한 /
( //
, ///
)의 조합을 단일로 바꿉니다./
변경된 라인을 mkdir "$1" || return 1
하기 test -d "$1" || { mkdir "$1" || return 1; }
때문에 mkdir
경로가 존재하고이 검사는 같은 구조를 포함하는 경로에 필요하면 오류와 함께 종료 aaa\.
(경우 aaa
이전 버전의 생성을 존재하지 않는 aaa
한 다음 다시 만들려고).
이 버전의 mkd는 경로가 이미 존재하는 경우 오류를 생성하지 않지만 (병렬 실행에서 여전히 이러한 오류를 생성 할 가능성이 있음) 명령 행에서 여러 디렉토리를 가져올 수 없습니다.