如果我有一个文件树,在下面说/usr/share/appname/
,我如何使用 GNUinstall
和 mode递归地安装它们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}"