재귀 mkdir


305

내가 간과하고있는 리눅스 명령이 있습니까? (의사)

$ mkdir -R foo/bar/zoo/andsoforth

아니면 한 번에 하나씩 디렉토리를 만드는 것 외에 다른 대안이 있습니까?



1
우스운, 나는 그 페이지를보고 있었다. 그러나 나는 그들이 그들을 어린이 (왼쪽에서 오른쪽)로 생각하고 있었기 때문에 "부모"를 완전히 간과했다.

18
팁 : 일부 껍질에서는 할 수도 있습니다 mkdir -p foo/{bar,baz}/zoo/andsoforth. 매우 유용한!
Aaron Copley

1
개인적으로, 나는 "재귀"man 페이지에서 "부모"뿐만 아니라, 내가 깃발 같은 느낌 때문에 "-r"을해야 간과 - 또는 이후 적어도 이러한 별칭을이 있어야 mkdir단지 6있다 문서화 된 플래그 지옥, 나는 기본적으로 명령이 디렉토리를 재귀 적으로 생성해야한다고 생각하며, 원하지 않으면 명시 적으로 지정해야합니다.
jbowman

답변:


511
$ mkdir -p foo/bar/zoo/andsoforth

92
참고로 -p는 ​​"부모"를 나타냅니다
carl crott

14
대신 다른 명령과 마찬가지로 모든 Linux 명령에 대해 특정 매개 변수를 기억하는 것은 불가능합니다.
Vedmant

2
그러나 mkdir -p크로스 플랫폼이 아니며 모든 쉘에서 작동하지 않습니다
Роман Коптев

9
@ РоманКоптев mkdir -pPOSIX에 지정되어 있으며 , 휴대 성이 가장 뛰어납니다 . 쉘 스크립트에서 무엇을 더 잘 기대하십니까?
와일드 카드

5
@StephanBijzitter 네, 이것은 unixandwindows.se가 아니라 unix.se입니다. :)
EEAA

16

사용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

이 스크립트에 의해 사용되는 autoconfautomake프로젝트. 가장 안전한 솔루션이라고 생각합니다.

당시 나는 표준이 /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는 경로가 이미 존재하는 경우 오류를 생성하지 않지만 (병렬 실행에서 여전히 이러한 오류를 생성 할 가능성이 있음) 명령 행에서 여러 디렉토리를 가져올 수 없습니다.


4
"mkdir -p"는 posix에 의해 정의됩니다. 어떤 유닉스 또는 유닉스 계열 변형이 지원하지 않습니까? (이것은 쉘 내장 이어서는 안되지만,
Tim B

5
이 페이지의 일부 정보는 15 년 전입니다. 일부는 나이가 많다.
Thomas Dickey

7
지원하지 않는 시스템 은 옵션의 끝을 표시 mkdir -p할 수있는 printf유틸리티 나 지원 --을 갖추기에는 너무 오래된 것 입니다.
Stéphane Chazelas

2
cdirname대한 잘못된 대답 foo/bar//또는 줄 바꿈 문자가 포함 된 디렉토리 이름 또는 현재 로케일의 유효하지 않은 문자를 제공합니다.
Stéphane Chazelas

2
printfPOSIX 시스템에서 안전합니다. POSIX 시스템 지원 mkdir -p. mkdir -pPOSIX에 의해 수십 년 동안 지정되었습니다. --80 년대 중반 SysIII부터 AT & T 시스템에 널리 보급되기 시작했습니다. 내가 믿는 내장 printf으로 처음 나타 났으며 ksh이후 POSIX에 의해 지정되었습니다 mkdir -p. 일부 POSIX 셸 (예 : pdksh 또는 yash 기반)에는 여전히 printf기본 제공 기능 이 없습니다 .
Stéphane Chazelas

0

-p명령의 옵션 mkdirp 디렉토리 를 필요에 따라 만듭니다 (있는 경우 오류 없음).

mkdir -p foo/bar/zoo/andsoforth

다른 방법은 예를 들어 &&(지정된 폴더가 존재하는 경우 오류)를 사용하는 것입니다.

mkdir foo && mkdir foo/bar && mkdir foo/bar/zoo && mkdir foo/bar/zoo/andsoforth

연결 연산자 &&는 명령을 함께 연결 하는 데 사용되므로 앞의 명령이 오류없이 종료 된 경우에만 다음 명령이 실행됩니다.

물론 첫 번째 방법이 더 좋습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.