Devin.KR
로그인

리눅스 mkdir 명령어 사용법 - -p 옵션과 권한 지정 실전 예제

개발자 조회 2

이 명령어를 언제 쓰는가

mkdir은 디렉토리를 만든다. 실무에서 손으로 하나씩 만드는 경우는 드물고, 대개 배포 스크립트에서 로그·업로드·릴리스 디렉토리를 미리 확보하거나, 날짜별 백업 디렉토리를 만드는 데 쓴다.

이때 핵심은 -p다. 중간 경로까지 한 번에 만들고, 이미 있어도 에러를 내지 않기 때문에 set -e가 걸린 스크립트에서 안전하다. 서비스용 디렉토리라면 권한을 함께 지정하는 -m도 같이 쓴다.

기본 형식

mkdir [옵션] 디렉토리 [디렉토리 ...]

디렉토리 이름은 여러 개를 한 번에 줄 수 있다. 옵션 없이 실행하면 부모 디렉토리가 반드시 존재해야 하고, 같은 이름이 이미 있으면 에러가 난다.

자주 쓰는 옵션

옵션의미예시
-p중간 경로까지 생성. 이미 있어도 에러 없음mkdir -p /opt/app/logs
-m생성과 동시에 퍼미션 지정(umask 무시)mkdir -m 750 /opt/app/secret
-v만든 디렉토리를 출력(스크립트 로그용)mkdir -pv a/b/c

실제로 쓰는 옵션은 이 세 개가 전부다. 나머지는 거의 볼 일이 없다.

실전 예제

1) 배포 시 필요한 디렉토리를 한 번에 확보한다 — 이미 있어도 실패하지 않으므로 스크립트 맨 앞에 그대로 둔다.

mkdir -p /opt/app/{logs,tmp,uploads}

중괄호 확장은 bash·zsh 기능이다. sh(dash)로 실행되는 스크립트에서는 전개되지 않고 {logs,tmp,uploads}라는 이름의 디렉토리 하나가 만들어지니 주의한다.

2) 날짜별 백업 디렉토리 생성 — cron으로 도는 백업 스크립트의 첫 줄에 해당한다.

BACKUP_DIR="/backup/$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR"
mysqldump -u backup -p"$PW" mydb > "$BACKUP_DIR/mydb.sql"

3) 남이 못 보게 권한까지 지정해서 만든다 — 인증서나 키를 넣을 디렉토리는 만들자마자 권한을 좁힌다.

mkdir -m 700 /etc/app/keys

4) 소유자를 서비스 계정으로 맞춘다 — root로 만든 디렉토리에 애플리케이션이 못 쓰는 사고가 가장 흔하다.

mkdir -p /var/log/myapp
chown app:app /var/log/myapp
chmod 750 /var/log/myapp

5) 여러 프로젝트 골격을 한 줄로 — 중첩된 구조도 -p로 한 번에 만든다.

mkdir -p project/{src,test}/{main,resources}

함정과 주의점

-m-p를 같이 쓰면 퍼미션은 마지막 디렉토리에만 적용된다. mkdir -p -m 700 a/b/c에서 ab는 umask 기본값(보통 755)으로 만들어지고 c만 700이 된다. 중간 경로 권한도 중요하다면 만든 뒤 chmod로 따로 지정한다.

umask 때문에 원하는 권한이 안 나온다. -m 없이 만들면 실제 권한은 0777 - umask다. umask가 022면 755, 077이면 700이 된다. 배포 계정과 cron의 umask가 달라 "손으로 하면 되는데 cron에서만 권한 문제"가 나는 일이 흔하다. 권한이 중요한 디렉토리는 항상 -m이나 chmod로 명시한다.

권한 문제를 chmod 777로 덮지 마라. 웹 서버가 못 쓴다고 777을 주면 서버의 모든 계정과, 웹으로 침투한 코드까지 쓰기 권한을 갖는다. 정답은 소유자·그룹을 서비스 계정으로 맞추고(chown) 750 또는 770을 주는 것이다.

같은 이름의 파일이 있으면 -p로도 못 만든다. mkdir: cannot create directory ... File exists가 뜬다. -p가 무시하는 건 "이미 디렉토리인 경우"뿐이다.

함께 보면 좋은 명령어

  • chown / chmod — 만든 직후 소유자와 권한을 맞추는 짝. mkdir 다음 줄에 거의 항상 온다.
  • rmdir — 빈 디렉토리만 지운다. 실수로 내용까지 날리지 않으므로 정리 스크립트에 안전하다.
  • install -d — 디렉토리 생성·소유자·권한을 한 명령으로 처리한다. install -d -o app -g app -m 750 /var/log/myapp