본문 바로가기
CS/Shell scripts

[Bash] 배쉬쉘에서 파일/디렉토리 유무 확인하기

by Warehaus 2021. 10. 6.

오늘은 업무 중 Bash script를 사용하다가 파일 존재 유무 확인이 필요해서 file check script를 작성했는데요,

앞으로도 Bash shell 을 이용한 파일체크가 잦아질 것 같아서 따로 정리하려 합니다.

 

File check 하는 조건문 만들기

우선 파일의 유무를 확인하기 위해서는 아래와 같은 조건문을 사용 하면 됩니다.

211006.sh

#!/bin/bash

FILE="./test"
if [ -f "$FILE" ]; then
    echo "$FILE exists."
else
    echo "$FILE not found."
fi

if [[ -f "$FILE" ]]; then
    echo "$FILE exists."
else
    echo "$FILE not found."
fi

 

실행결과

$ ./211006.sh 
./test not found.
./test not found.

$ touch test
$ ./211006.sh 
./test exists.
./test exists.

 

파일 존재여부를 체크하는 과정은 아주 단순합니다. 그러면 디렉토리는 어떨까요? 앞의 스크립트를 이용해 디렉토리 유무가 체크되는지 확인해 봤습니다.

$ rm test
$ mkdir test
$ ./211006.sh 
./test not found.
./test not found.

 

기존 touch를 이용해 만들었던 test파일을 지우고 디렉토리를 생성한 뒤 체크해 보았으나, 잘 되지 않습니다. 그럼 디렉토리는 어떻게 확인할까요?

 

Directory 확인하는 조건 문 만들기

디렉토리 확인을 위해서는 '-f' 가 아닌 '-d' 를 이용해 존재유무를 확인할 수 있습니다.

아래와 같이 스크립트 내용을 변경해 보았습니다.

#!/bin/bash

FILE="./test"
if [ -f "$FILE" ]; then
    echo "$FILE exists."
else
    echo "$FILE not found."
fi

if [[ -f "$FILE" ]]; then
    echo "$FILE exists."
else
    echo "$FILE not found."
fi

if [ -d "$FILE" ]; then
    echo "$FILE exists."
else
    echo "$FILE not found."
fi

if [[ -d "$FILE" ]]; then
    echo "$FILE exists."
else
    echo "$FILE not found."
fi

위의 스크립트는 기존에 파일체크를 위해 사용했던 내용, 아래는 디렉토리를 확인하기 위한 조건 문 입니다.

실행해 보면 다음과 같은 결과를 얻을 수 있습니다.
( 현재 작업 경로에는 test 파일이 아닌 디렉토리가 생성되어 있는 상황입니다.)

$ ./211006.sh 
./test not found.
./test not found.
./test exists.
./test exists.

디렉토리는 '-f' 로 체크되지 않고, '-d' 로만 체크가 됩니다.

그러면 디렉토리, 파일 구분하지 않고 체크하는 방법은 없을까요?

 

Directory, File 구분없이 존재여부 체크하기

 

Directory, File 구분없이 존재 여부를 체크하기 위해서는 '-e' 를 사용해서 조건문을 구성하면 됩니다.

exist 여부를 확인하는 조건문으로 테스트를 위해 아래와 같이 스크립트를 작성 해 줍니다.

FILE="./f_test"
DIR="./d_test"

if [ -e "$FILE" ]; then
    echo "$FILE exists."
else
    echo "$FILE not found."
fi

if [[ -e "$FILE" ]]; then
    echo "$FILE exists."
else
    echo "$FILE not found."
fi

if [ -e "$DIR" ]; then
    echo "$DIR exists."
else
    echo "$DIR not found."
fi

if [[ -e "$DIR" ]]; then
    echo "$DIR exists."
else
    echo "$DIR not found."
fi

 

실행하면 아래와 같은 결과를 얻을 수 있습니다. 

현재 작업 경로에는 f_test 파일과 d_test 디렉토리가 있는 상태입니다.

$ ./211006.sh 
./f_test exists.
./f_test exists.
./d_test exists.
./d_test exists.

 

위에 작성 된 세가지 유형의 조건문만 작성 가능하다면, 파일의 존재유무를 체크해서 일련의 작업을 수행하는데 전혀 문제가 없을 것이라 생각이 됩니다.

 

끝.