Bash를 사용하여 하나 이상의 파일(디렉토리/ies)이 존재하는지 확인하는 방법은 무엇입니까?

Bash를 사용하여 하나 이상의 파일(디렉토리/ies)이 존재하는지 확인하는 방법은 무엇입니까?

Bash 3.2.52(2)가 설치된 CentOS에서는 이전에 존재하지 않았는지 확인한 후 두 백업 디렉터리를 모두 생성해 보았습니다.

rm -rf "${general_backups_dir}"
rm -rf "${specific_backups_dir}"
mkdir -p "${general_backups_dir}"
mkdir -p "${specific_backups_dir}"

작업을 테스트하려면 ls -la디버그 모드에서 작업할 수 있지만 두 디렉터리의 존재를 나타내는 더 정확한 방법을 원합니다.


이것은 작동하지 않습니다:

ls -la ${HOME} | grep "${general_backups_dir}"
ls -la ${HOME} | grep "${specific_backups_dir}"

그런데 저는 (의사 코드)와 같은 한 줄 연산을 선호합니다.

ls -la ${HOME} | grep *EXPRESSION_INCLUDED_IN_BOTH_DIRECTORY_NAMES*

답변1

-d다음에서 테스트 연산자를 사용하여 디렉토리가 존재하는지 확인하십시오 bash.

if [[ -d testdir ]]; then echo "testdir already exists"; else mkdir testdir; fi

"testdir"을 변수로 바꿀 수 있습니다. 안전을 위해 변수를 큰따옴표로 묶으십시오.

if [[ -d "$backup_dir"]]; then echo "$backup_dir already exists"; else mkdir "$backup_dir"; fi

중첩된 디렉터리(예: dir1/dir2/dir3)인 경우 대신 를 사용하세요 mkdir -p.

파일 테스트 연산자에 대한 자세한 내용은 다음을 참조하세요 bash.https://tldp.org/LDP/abs/html/fto.html

답변2

POSIX 셸에 파일이 있는지 확인하는 구문은 다음과 같습니다.

if [ -e "$file" ] || [ -L "$file" ]; then
  printf '%s\n' "The $file file exists"
  if [ -d "$file" ]; then
    if [ -L "$file" ]; then
      echo "and it's a symlink to a directory"
    else
      echo "and it's a directory"
    fi
  else
    echo "and it's not a directory (or I couldn't tell if it was)"
  fi
else
  printf '%s\n' "$file does not appear to exist"
fi

따라서 중요한 상황에서 실행하려는 코드를 여기에 삽입할 수 있습니다.

-f이제 주목해주세요 왜냐하면

rm -rf -- "$file" || exit

$file사전에 존재하지 않는 곳에서는 성공할 것입니다. 실패한 종료 상태가 반환되는 유일한 경우 rm는 파일이 여전히 존재하는 경우입니다(해당 파일은 있지만 삭제할 수 없음).

$file따라서 존재하지만 유형이 아닌 경우를 다루려는 경우가 아니면 사전에 확인할 필요가 없을 것입니다.목차.

그리고:

mkdir -p -- "$file" || exit

존재 하는 한 성공할 $file것이며 이미 존재하더라도 디렉토리로 판별될 수 있습니다.

다시 말하지만, 사전에 테스트할 필요는 없을 것입니다.

관련 정보