배열에 저장된 모든 디렉터리가 존재하는지 확인하는 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/path3
Linux나 쉘 스크립팅을 막 배우는 분들에게는 이것이 정확히 여러분이 찾고 있는 것이 아닐 수도 있다는 점을 지적하고 싶습니다 . 스크립트에 , 및 를 추가하는
것이 좋습니다 .chown
chmod
sort
/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 )
이렇게 하면 상위 레벨 디렉토리가 하위 레벨 디렉토리보다 먼저 표시됩니다.
다음으로 변경하고 싶은 것은 -m
for 패턴입니다. 이렇게 하면 원하는 권한이 디렉터리에 설정됩니다.
mkdir -m ${mode} ${dir}
소유자와 그룹을 설정합니다(특히 루트로 실행하는 경우). GroupA 및 GroupB의 구성원인 경우 mkdir 명령은 그룹 소유자를 기본 그룹(명령에 표시된 첫 번째 그룹 id
)으로 설정합니다. 그러므로:
[[ ! -d "$dir" ]] && mkdir -m ${mode} "$dir" && chown ${user}:${group} "${dir}"