dir이 아직없는 경우에만 mkdir하는 방법은 무엇입니까?


1987

AIX의 KornShell (ksh)에서 실행되는 쉘 스크립트를 작성 중입니다. mkdir명령을 사용하여 디렉토리를 만들고 싶습니다 . 그러나 디렉토리가 이미 존재할 수 있으며,이 경우 아무것도하고 싶지 않습니다. 따라서 디렉토리가 존재하지 않는지 테스트하거나 mkdir기존 디렉토리를 작성할 때 발생하는 "파일 존재"오류를 억제 하려고합니다.

최선의 방법에 대한 생각이 있으십니까?

답변:


3294

시도 mkdir -p:

mkdir -p foo

존재하지 않는 중간 디렉토리도 생성됩니다. 예를 들어

mkdir -p foo/bar/baz

디렉토리를 만들 것입니다 foo, foo/bar그리고 foo/bar/baz그들은 존재하지 않는 경우.

GNU와 같은 일부 구현 mkdir에는 mkdir --parents더 읽기 쉬운 별칭이 포함되지만 POSIX / Single Unix Specification에는 지정되어 있지 않으며 macOS, 다양한 BSD 및 다양한 상용 Unix와 같은 많은 공통 플랫폼에서는 사용할 수 없으므로 피해야합니다.

상위 디렉토리가 존재하지 않을 때 오류가 발생하고 존재하지 않는 경우 디렉토리를 작성하려는 경우 먼저 디렉토리가 존재할 수 있습니다 test.

[ -d foo ] || mkdir foo

11
당신이 사용하는 단축 된 예는 당신이해서는 안되는 것입니다. 코딩 공간을 절약하는 논리를 바꾸고 있지만 사용해야합니다! &&& 읽고 읽는 사람들에게 더 의미가 있습니다.
Mike Q

16
@AndreasLarsen이 질문은 mkdirWindows가 아닌 Unix 계열 시스템에 관한 것입니다. -pPOSIX / Single Unix 사양 준수에 필요하므로 해당 사양을 준수하려는 모든 것이 지원 -p됩니다. Cygwin 또는 MSYS와 같은 POSIX 에뮬레이션 계층을 사용하지 않으면 Windows는 완전히 다릅니다.
Brian Campbell

22
나는 오늘 흥미로운 것을 발견했습니다 mkdir -p. 대괄호를 사용할 수 있습니다! {}명령에서 "복잡한"디렉토리 트리를 작성합니다. 여기를 참조하십시오 : technosophos.com/2010/04/15/...
에르베

12
@MikeQ ||대신 &&전체 줄에 올바른 종료 상태가 있기 때문에 대신 선호 합니다. 쉘이 실행 errexit중이거나 그 라인이 함수, 스위치 케이스 등의 마지막 라인 인 경우 중요합니다 .
rudimeier

9
@herve 그것은 아무 상관이 없다 mkdir; 쉘은 이러한 표현식을 전달 된 개별 인수 목록으로 확장합니다 mkdir.
chepner

176

이것은 작동해야합니다 :

$ mkdir -p dir

또는:

if [[ ! -e $dir ]]; then
    mkdir $dir
elif [[ ! -d $dir ]]; then
    echo "$dir already exists but is not a directory" 1>&2
fi

디렉토리가 존재하지 않는 경우 디렉토리를 작성하지만 작성하려는 디렉토리 이름이 디렉토리 이외의 다른 디렉토리에서 이미 사용중인 경우 경고합니다.


나는 korn에 -d 연산자가 있다고 생각하지 않습니다. 오히려 -e는 파일 / 디렉토리 모두에 사용되며 존재를 확인합니다. 또한 성공하면 모두 0을 반환합니다. 중복됩니다. 틀 렸으면 말해줘.
alkar

1
AFAIK, 두 가지 모두 잘못되었습니다. 테스트 는 성공하면 true 를 반환 하고 -d도 존재합니다 (적어도 MacOS X에서는)
Alnitak

5
이것이 스레드 안전하지 않다는 것을 언급 할 가치가 있습니다. 디렉토리가 존재하는지 확인하는 시간과 쓰려고하는 시간 사이에 상황이 바뀔 수 있습니다.
Justin L.


73

하나의 명령으로 복잡한 디렉토리 트리 정의

mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}

존재하는 경우 오류 없음, 필요에 따라 부모 디렉토리 만들기
Fedir RYKHTIK

18
이것은 mkdir그 자체 의 기능이 아니라 명령을 실행하는 쉘입니다. 이를 괄호 확장이라고합니다. AFAIK, Bash, ksh, zsh 및 C 쉘만 지원합니다.
Daniel Kamil Kozar

3
쉼표 주위에 공백이 있으면 예기치 않은 결과가 발생할 수 있습니다. 조심하십시오.
Atlas7

1
@ Atlas7에 따르면, 일반적으로 정규 표현식의 일부인 문자를 이스케이프해야합니다. (즉, 대신에 folder name를 사용해야합니다 folder\ name)
John Hamilton

1
이것은 답이 아닙니다. 이것은 주석으로 더 적합한 별도의 주제입니다.
Chris 페이지

40

오류 메시지를 표시하지 않으려면 다음을 수행하십시오.

[ -d newdir ] || mkdir newdir

자체 오류 메시지를 표시하려면 다음을 수행하십시오.

[ -d newdir ] && echo "Directory Exists" || mkdir newdir

20

오래된 시도와 진실

mkdir /tmp/qq >/dev/null 2>&1

다른 많은 솔루션이 가지고있는 경쟁 조건없이 원하는 것을 할 수 있습니다.

때로는 가장 단순하고 추악한 솔루션이 가장 좋습니다.


5
"tmp"가 없으면 실패합니다. 또한 확인을 제공하지도 않습니다.
Mike Q

15

mkdir foo디렉토리가 존재하더라도 작동합니다. "foo"라는 디렉토리가없는 경우에만 작동하게하려면 -p플래그를 사용해보십시오 .

예 :-

mkdir -p foo

"foo"라는 디렉토리가없는 경우에만 디렉토리가 작성됩니다. :)


2
@BrianCampbell에서 언급했듯이 경로에 다른 디렉토리도 생성됩니다. 예를 들어 볼륨이 마운트 해제되면 마운트 지점에 디렉토리가 생성 될 수 있으므로 위험 할 수 있습니다.
uliwitness

11
directory_name = "foo"

if [ -d $directory_name ]
then
    echo "Directory already exists"
else
    mkdir $directory_name
fi

10

또는 존재 여부를 먼저 확인하려면 다음을 수행하십시오.

if [[ ! -e /path/to/newdir ]]; then
            mkdir /path/to/newdir
fi

-e 는 korn 쉘에 대한 기존 테스트입니다.

korn 쉘 매뉴얼을 인터넷 검색 할 수도 있습니다.


10

mkdir은 Windows 8 이상 시스템에서 더 이상 -p 스위치를 지원하지 않습니다.

이것을 사용할 수 있습니다 :

IF NOT EXIST dir_name MKDIR dir_name

10
OP는 AIX kornshell에 관한 것이 었습니다 ... Windows와는 아무런 관련이 있습니까?
J. Chomel

9

man mkdir옵션에 대한 매뉴얼 페이지 참조 -p

   -p, --parents
          no error if existing, make parent directories as needed

주어진 경로에 모든 디렉토리를 생성합니다. 존재하는 경우 오류가 발생하지 않으면 주어진 경로에서 왼쪽에서 오른쪽으로 모든 디렉토리를 생성합니다. 아래 명령을 시도하십시오. 디렉토리 newdiranotherdir이 명령을 실행하기 전에 존재하지 않습니다

올바른 사용법

mkdir -p /tmp/newdir/anotherdir

명령을 실행 한 후에는 볼 수 newdiranotherdir/ tmp를 아래에 작성. 이 명령은 원하는 횟수만큼 실행할 수 있으며 명령에는 항상 있습니다 exit(0). 이러한 이유로 인해 대부분의 사람들은 실제 경로를 사용하기 전에 쉘 스크립트에서이 명령을 사용합니다.


8

디렉토리를 작성하는 것보다 디렉토리가 존재하는지 여부를 확인하기 위해 if 루프를 사용할 수 있습니다.

1) dir = / home / dir_name

if [ ! -d $dir ]
then
     mkdir $dir
else
     echo "Directory exists"  
fi

2) mkdir을 -p 옵션과 함께 사용하여 디렉토리를 만들 수 있습니다. 디렉토리를 사용할 수 없는지 확인합니다.

mkdir -p $dir

mkdir -p는 디렉토리의 트리 구조를 만들 수도 있습니다. 동일한 명령을 사용하여 상위 및 하위 디렉토리를 작성하려는 경우 mkdir -p를 선택할 수 있습니다.

mkdir -p /home/parent_dir /home/parent_dir/child1 /home/parent_dir/child2

if 루프를 사용하면 어떤 이점이 있습니까? 왜 누군가가 -p 옵션보다 그것을 선택했을까요?!
pedram bashiri

1
폴더가 없을 때 폴더를 만드는 방법을 공유했습니다. 그것은 하나의 요구 사항에 달려 있습니다. 폴더가 존재하지 않는지 확인해야하는 유스 케이스가 있고이를 추적하여 솔루션 1을 수행 할 수있는 경우 중요하지 않은 경우 솔루션 2를 사용하여 폴더를 작성합니다. 존재하지 않는 경우.
AbhinavVaidya8

나는 루프를 보지 못했다.
Amit Naidu

3

디렉토리가 존재하지 않는 경우 디렉토리를 만들 수있는 간단한 함수 (bash 쉘)입니다.

#----------------------------------
# Create a directory if it doesn't exist
#------------------------------------
createDirectory() {
    if [ ! -d $1 ]
        then
        mkdir -p $1
    fi
}

위 함수를 다음과 같이 호출 할 수 있습니다.

createDirectory / tmp / fooDir / BarDir

위의 fooDir 및 BarDir이 없으면 만듭니다. 디렉토리를 재귀 적으로 작성하는 mkdir 명령의 "-p"옵션에 유의하십시오. 도움이 되었기를 바랍니다.


2
mkdir -p sam
  • mkdir = 디렉토리 만들기
  • -p =-부모
  • (존재하는 경우 오류 없음, 필요에 따라 부모 디렉토리 만들기)

2
if [ !-d $dirName ];then
     if ! mkdir $dirName; then  # Shorter version. Shell will complain if you put braces here though
     echo "Can't make dir: $dirName"
     fi
fi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.