Bash는 디렉토리가 존재하는지 확인합니다. 배열을 사용하여 생성되지 않은 경우

Bash는 디렉토리가 존재하는지 확인합니다. 배열을 사용하여 생성되지 않은 경우

배열에 저장된 모든 디렉터리가 존재하는지 확인하는 Bash 스크립트를 작성하고 싶습니다. 그렇지 않은 경우 스크립트가 이를 생성해야 합니다. 이것이 올바른 접근 방식입니까?

array1=(
/apache
/apache/bin
/apache/conf
/apache/lib
/www
/www/html
/www/cgi-bin
/www/ftp
)
if [ ! -d “$array1” ]; then
  mkdir $array1
else 
  break
fi

답변1

그냥 사용:

mkdir -p -- "${array1[@]}"

필요한 경우 중간 디렉터리 구성 요소도 생성되므로 리프 디렉터리만 포함하도록 배열을 줄일 수도 있습니다.

array1=(
  /apache/bin
  /apache/conf
  /apache/lib
  /www/html
  /www/cgi-bin
  /www/ftp
)

다음과 같이 작성할 수도 있습니다.

array1=(
  /apache/{bin,conf,lib}
  /www/{html,cgi-bin,ftp}
)

[[ -d ... ]] || mkdir ...일반적으로 도입되는 메소드 종류TOCTOU 경쟁 조건가능하면 피하는 것이 가장 좋습니다(비록 이 특별한 경우에는 문제가 되지 않을 것 같지만).

답변2

배열을 반복해야 합니다. 그런 다음 bash에서 제안합니다.

array1=(
/apache
/apache/bin
/apache/conf
/apache/lib
/www
/www/html
/www/cgi-bin
/www/ftp
)
for dir in "${array1[@]}"; do
  [[ ! -d "$dir" ]] && mkdir "$dir"
done

답변3

@darxmurf가 제공한 답변을 확장하고 싶습니다.


mkdir /path1/path2/path3Linux나 쉘 스크립팅을 막 배우는 분들에게는 이것이 정확히 여러분이 찾고 있는 것이 아닐 수도 있다는 점을 지적하고 싶습니다 . 스크립트에 , 및 를 추가하는
것이 좋습니다 .chownchmodsort

/path1/path2존재하지 않으면 실패 mkdir /path1/path2/path3합니다.
이는 다음과 같이 약간 수정될 수 있습니다.
mkdir -p /path1/path2/path3

이 경우 명령을 실행하는 사용자의 UID, GID 및 UMASK를 사용하여 3개의 경로가 모두 생성됩니다. 사용자의 UMASK가 077인 경우 다음과 같이 끝날 수 있습니다.
mkdir -m 777 -p /path1/path2/path3
디렉터리는 다음과 같습니다.

drwx------ /path1
drwx------ /path2
drwxrwxrwx /path3

당신이 원하는 것이 아닌가요?

을 사용하면 sort짧은 경로가 먼저 정렬됩니다. 배열을 생각해 보세요.
/apache/bin/cache /apache /apache/bin
실제로 배열이 다음과 같기를 원합니다.
/apache /apache/bin /apache/bin/cache

내가 제안한 첫 번째 변경 사항은 다음과 같습니다.

array=(
/apache
/apache/bin
/apache/conf
/apache/lib
/www
/www/html
/www/cgi-bin
/www/ftp
)
array1=$( echo "${array[@]}" | tr ' ' '\n' | sort )

이렇게 하면 상위 레벨 디렉토리가 하위 레벨 디렉토리보다 먼저 표시됩니다.

다음으로 변경하고 싶은 것은 -mfor 패턴입니다. 이렇게 하면 원하는 권한이 디렉터리에 설정됩니다.
mkdir -m ${mode} ${dir}

소유자와 그룹을 설정합니다(특히 루트로 실행하는 경우). GroupA 및 GroupB의 구성원인 경우 mkdir 명령은 그룹 소유자를 기본 그룹(명령에 표시된 첫 번째 그룹 id)으로 설정합니다. 그러므로: [[ ! -d "$dir" ]] && mkdir -m ${mode} "$dir" && chown ${user}:${group} "${dir}"

관련 정보