본문으로 건너뛰기
0%

Bash: 디렉토리 존재 여부 확인하는 방법

카테고리

문제

디렉토리를 사용하기 전에 존재하는지 확인해야 하나요? Bash에서 제대로 하는 방법을 알려드립니다!

기본 디렉토리 확인

#!/bin/bash

test_dir_exist(){
    set -e 
    if [ -e "/home/jayleekr/workspace/00_codes/05_info_archive" ]; then
        echo "DIR Exist"
        exit 1
    fi
}

test_fail(){
    echo "test_fail"
}

test_dir_exist

실행 결과:

$ ./directory_ex.sh
DIR Exist

더 나은 접근 방법

1. 디렉토리 전용 확인을 위한 -d 사용

#!/bin/bash

check_directory() {
    local dir_path="$1"
    
    if [ -d "$dir_path" ]; then
        echo "✅ 디렉토리 '$dir_path' 존재함"
        return 0
    else
        echo "❌ 디렉토리 '$dir_path' 존재하지 않음"
        return 1
    fi
}

# 사용법
check_directory "/home/user/workspace"

2. 디렉토리가 없으면 생성하기

#!/bin/bash

ensure_directory() {
    local dir_path="$1"
    
    if [ ! -d "$dir_path" ]; then
        echo "디렉토리 생성 중: $dir_path"
        mkdir -p "$dir_path"
    else
        echo "디렉토리가 이미 존재합니다: $dir_path"
    fi
}

# 사용법
ensure_directory "/tmp/my_project/logs"

3. 여러 디렉토리 확인하기

#!/bin/bash

check_multiple_dirs() {
    local dirs=("$@")
    local all_exist=true
    
    for dir in "${dirs[@]}"; do
        if [ ! -d "$dir" ]; then
            echo "❌ 없음: $dir"
            all_exist=false
        else
            echo "✅ 발견: $dir"
        fi
    done
    
    if [ "$all_exist" = true ]; then
        echo "🎉 모든 디렉토리가 존재합니다!"
        return 0
    else
        echo "💥 일부 디렉토리가 없습니다!"
        return 1
    fi
}

# 사용법
check_multiple_dirs "/tmp" "/home" "/var/log" "/nonexistent"

다양한 테스트 연산자

파일과 디렉토리를 테스트하는 다양한 방법들:

# -e: 존재함 (파일 또는 디렉토리)
[ -e "/path" ] && echo "/path에 무언가 존재함"

# -f: 일반 파일 존재
[ -f "/path/file.txt" ] && echo "파일 존재함"

# -d: 디렉토리 존재
[ -d "/path/dir" ] && echo "디렉토리 존재함"

# -r: 읽기 가능
[ -r "/path" ] && echo "읽기 가능"

# -w: 쓰기 가능
[ -w "/path" ] && echo "쓰기 가능"

# -x: 실행 가능
[ -x "/path" ] && echo "실행 가능"

실용적인 예제

1. 백업 스크립트

#!/bin/bash

BACKUP_DIR="/backup/$(date +%Y%m%d)"

if [ ! -d "$BACKUP_DIR" ]; then
    echo "백업 디렉토리 생성 중: $BACKUP_DIR"
    mkdir -p "$BACKUP_DIR"
fi

echo "백업 위치: $BACKUP_DIR"
# 여기에 백업 명령어 추가...

2. 프로젝트 설정

#!/bin/bash

setup_project() {
    local project_name="$1"
    local project_dirs=("$project_name/src" "$project_name/tests" "$project_name/docs")
    
    for dir in "${project_dirs[@]}"; do
        if [ ! -d "$dir" ]; then
            echo "생성 중: $dir"
            mkdir -p "$dir"
        fi
    done
    
    echo "프로젝트 구조 생성 완료: $project_name"
}

# 사용법
setup_project "my_awesome_app"

3. 로그 순환 확인

#!/bin/bash

LOG_DIR="/var/log/myapp"
ARCHIVE_DIR="/var/log/myapp/archive"

if [ -d "$LOG_DIR" ]; then
    echo "로그 디렉토리 존재함"
    
    # 필요시 아카이브 디렉토리 생성
    [ ! -d "$ARCHIVE_DIR" ] && mkdir -p "$ARCHIVE_DIR"
    
    # 로그 순환
    find "$LOG_DIR" -name "*.log" -mtime +7 -exec mv {} "$ARCHIVE_DIR" \;
else
    echo "로그 디렉토리를 찾을 수 없음: $LOG_DIR"
    exit 1
fi

프로 팁

  1. 항상 변수를 따옴표로 감싸기: [ -d "$dir" ] (O), [ -d $dir ] (X)
  2. 디렉토리에는 -d 사용: -e보다 더 구체적
  3. 경로의 공백 처리: 따옴표로 공백으로부터 보호
  4. 종료 코드가 중요: 스크립팅을 위해 의미 있는 종료 코드 반환
  5. 상위 디렉토리 생성: mkdir -p를 사용하여 중첩된 디렉토리 생성

흔한 실수

# ❌ 이렇게 하지 마세요
if [ -d $HOME/my dir ]; then  # 공백으로 인해 오류 발생!

# ✅ 대신 이렇게 하세요
if [ -d "$HOME/my dir" ]; then  # 올바르게 따옴표 처리

# ❌ 이렇게 하지 마세요
if [ -e "$dir" ]; then  # 파일일 수도 있음!

# ✅ 디렉토리 확인은 이렇게
if [ -d "$dir" ]; then  # 구체적으로 디렉토리 확인

참고자료

디렉토리 확인은 기본 중의 기본입니다 - 올바르게 사용하면 스크립트가 훨씬 견고해집니다! 🚀

댓글 남기기

여러분의 생각을 들려주세요

댓글

GitHub 계정으로 로그인하여 댓글을 남겨보세요. 건설적인 의견과 질문을 환영합니다!

댓글을 불러오는 중...