본문 바로가기

Linux

Linux) C에서 mkdir -p 처럼 디렉토리 만드는 방법

$  mkdir -p (path)

- mkdir -p 를 사용하면 mkdir를 하되 중간 지점에 있는 디렉토리들을 생성해줍니다.

- 예를 들어) mkdir -p /etc/abc/def 라고 입력을 한다면 /etc/abc라는 디렉토리가 없더라도 -p 옵션을 통해 필요한 최종 path의 directory (/etc/abc/def) 를 만드는데 필요한 디렉토리를 만들어 줍니다.

 

-p 옵션이란?

  • -p, --parents no error if existing, make parent directories as needed (출저:linux.die.net/man/1/mkdir)

 

하지만, 소스코드에서 mkdir -p 커맨드를 사용하는 것처럼 디렉토리를 생성하려면 어떻게 하면 될까요?

 

 

아래는 dirname 함수stat 함수를 사용해서 mkdir을 하되 -p 옵션처럼 동작하도록 구현한 C 코드 입니다.

bool makeDir(const char* dirPath) {
    if (strcmp(dirPath, ".") == 0 || strcmp(dirPath, "/") == 0)
      return true;
    struct stat info;
    if (stat(dirPath, &info) == 0) return true;
    char* parent;
    char* tmp;
    tmp = strdup(dirPath);
    parent = dirname(tmp);
    if (stat(parent, &info) != 0) makeDir(parent);
    mode_t modeSet = 0777;
    mkdir(dirPath, modeSet);
    return true;
}
  • dirname(char* path) 함수는 주어진 path의 부모 경로 (상위 디렉토리)의 경로를 char*로 반환해주는 함수입니다.
  • 주의: dirname 인자로 const 형을 줄 수 없으니 strdup로 복사본을 만든 뒤 복사본을 인자로 사용해야 합니다.
  • stat 함수를 사용하여 부모 경로 (parent)가 현재 유효한지를 판별 (유효 하면 0을 반환) 합니다.
  • 유효하지 않다고 판단되면 부모 경로부터 만들도록 makeDir 함수를 재귀적으로 호출합니다.
  • modeSet (0777) 같은 경우 해당 값이 umask (0022) 값과 ~연산 되어서 0755 (rwxr--r--) 권한으로 디렉토리를 생성하게 됩니다.