아래와 같은 파일 트리가 있는 경우 /usr/share/appname/
GNU 및 모드를 사용하여 어떻게 install
재귀적으로 설치 합니까 644
?
나는 내가 먼저 필요하다고 가정하고install
디렉터리 생성-d
디렉터리 권한이 달라야 하기 때문입니다( 755
).
물론 이것은 해결책이 아닙니다.
local dir file
for dir in "${dirs_with_files[@]}"; do
for file in "$srcdir/$dir"/*; do
# install fails if given a directory, so check:
[[ -f $file ]] && install -Dm644 -t "$dir" "$file"
done
done
답변1
파일을 재귀적으로 설치 하는 마법의 주문은 없습니다 install
. 아마도 이 경우 최고의 도구는 아닐 것입니다. 파일 및 디렉터리 구조 복사를 사용한 다음 복구 모드를 install
사용하는 것이 더 좋습니다 .cp
chmod
답변2
먼저 디렉터리 트리를 만든 다음 다음 함수에 표시된 대로 파일을 복사합니다.
#!/usr/bin/env bash
# Install directory
# returns 1 on error
# $1: Source directory
# $2: Target directory
_install_directory() {
local _src="${1}" \
_dest="${2}" \
_path=()
# Directory does not exist
[ ! -d "${_src}" ] && \
return 1
while IFS="" \
read -r \
_path; do
[ -d "${_dest}/${path}" ] || \
mkdir -m 0755 \
-p \
"${_dest}/${path}" || \
return 1
done <<<$(find "${_src}" \
-type d \
-printf '%P\n')
# files
while IFS="" \
read -r \
_path; do
[ -z "${_path}" ] && \
continue
install -m 0644 \
"${_src}/${_path}" \
"${_dest}/${_path}" || \
return 1
done <<<$(find "${_src}" \
-type f \
-printf '%P\n')
# symlinks
while IFS= \
read -r \
_path; do
[ -z "${_path}" ] && \
continue
cp -fPT \
"${_dir}/${_path}" \
"${_dest}/${_path}" || \
return 1
done <<<$(find "${_src}" \
-type l \
-printf '%P\n')
}
_src="${1}"
_dest="${2}"
_install_directory "${_src}" \
"${_dest}"