내가 간과한 다음 작업을 수행하는 Linux 명령이 있습니까? (의사)
$ mkdir -R foo/bar/zoo/andsoforth
아니면 한 번에 하나의 디렉터리를 만드는 것 외에는 다른 선택이 없습니까?
답변1
$ mkdir -p foo/bar/zoo/andsoforth
매개변수 p
는 "상위"를 나타냅니다.
답변2
사용mkdir -p
대부분의 최신 운영 체제의 경우 이는 간단한 접근 방식입니다.
mkdir -p foo/bar/zoo/andsoforth
그러나 mkdir -p
많은 매뉴얼에서는 권장되지 않습니다. GNU 문서 make
와 autoconf
사용 문제에 대한 정보를 읽어보세요 mkdir -p
.
- http://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.69/html_node/Limitations-of-Usual-Tools.html#Limitations-of-Usual-Tools
- http://www.gnu.org/savannah-checkouts/gnu/make/manual/html_node/Utilities-in-Makefiles.html
크로스 플랫폼 설치 및 구성 시스템에는 자체 보안이 있습니다.교체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
(paths의 올바른 사용 /
, 기본 이름만 있는 경로, trailing s가 있는 경로 /
, trailing s가 있거나 없는 경로 \n
). 경로에 개행 문자나 현재 로케일에 대해 잘못된 문자가 포함되어 있으면 이 함수가 제대로 작동하지 않습니다. 또한 /
( //
, ) ///
의 모든 조합을 단일로 대체합니다./
경로가 존재하고 유사한 구조를 포함하는 경로에 이 확인이 필요하면 오류가 종료되므로 줄 을 mkdir "$1" || return 1
다음으로 변경합니다 ( 존재하지 않는 경우 이전 버전에서 경로를 생성한 다음 다시 생성을 시도합니다).test -d "$1" || { mkdir "$1" || return 1; }
mkdir
aaa\.
aaa
aaa
이 버전의 mkd는 경로가 이미 존재하는 경우 오류를 생성하지 않으며(그러나 병렬 실행에서는 여전히 이러한 오류를 생성할 수 있음) 명령줄에서 여러 디렉터리를 가져올 수 없습니다.
답변3
-p
mkdir
make 명령의 옵션피디렉토리 없음필요에 따라(있는 경우 오류가 발생하지 않음):
mkdir -p foo/bar/zoo/andsoforth
또 다른 방법은 예를 들어 다음을 사용하는 것입니다 &&
(지정된 폴더가 존재하는 경우 오류 발생).
mkdir foo && mkdir foo/bar && mkdir foo/bar/zoo && mkdir foo/bar/zoo/andsoforth
연결 연산자는 &&
이전 명령이 오류 없이 종료되는 경우에만 다음 명령이 실행되도록 명령을 함께 연결하는 데 사용됩니다.
물론 첫 번째 방법이 더 좋습니다.
답변4
mkdir foo foo/bar foo/bar/zoo/ foo/bar/zoo/andsofort.
이것은 트릭을 수행해야합니다.