120 lines
3.3 KiB
Bash
120 lines
3.3 KiB
Bash
#!/bin/bash
|
|
# Ver: 1.0 by Endial Fang (endial@126.com)
|
|
#
|
|
# 文件管理函数库
|
|
|
|
# 加载依赖项
|
|
. /usr/local/scripts/liblog.sh # 日志输出函数库
|
|
|
|
# 函数列表
|
|
|
|
# Ensure a file/directory is owned (user and group) but the given user
|
|
# Arguments:
|
|
# $1 - filepath
|
|
# $2 - owner
|
|
ensure_owned_by() {
|
|
local path="${1:?path is missing}"
|
|
local owner="${2:?owner is missing}"
|
|
|
|
chown "$owner":"$owner" "$path"
|
|
}
|
|
|
|
# 检测目录是否存在,如果不存在则创建,同时修改为指定的用户
|
|
# Arguments:
|
|
# $1 - directory
|
|
# $2 - owner
|
|
ensure_dir_exists() {
|
|
local dir="${1:?directory is missing}"
|
|
local owner="${2:-}"
|
|
|
|
mkdir -p "${dir}"
|
|
if [[ -n $owner ]]; then
|
|
ensure_owned_by "$dir" "$owner"
|
|
fi
|
|
}
|
|
|
|
# 检测目录是否存在或为空
|
|
# 参数:
|
|
# $1 - 目录路径
|
|
# 返回值:
|
|
# 布尔值
|
|
is_dir_empty() {
|
|
local dir="${1:?missing directory}"
|
|
|
|
if [[ ! -e "$dir" ]] || [[ -z "$(ls -A "$dir")" ]]; then
|
|
true
|
|
else
|
|
false
|
|
fi
|
|
}
|
|
|
|
# 循环设置目录中子目录及文件权限
|
|
# 参数:
|
|
# $1 - paths (as a string).
|
|
# Flags:
|
|
# -f|--file-mode - 文件权限模式
|
|
# -d|--dir-mode - 目录权限模式
|
|
# -u|--user - 用户
|
|
# -g|--group - 用户组
|
|
configure_permissions_ownership() {
|
|
local -r paths="${1:?paths is missing}"
|
|
local dir_mode=""
|
|
local file_mode=""
|
|
local user=""
|
|
local group=""
|
|
|
|
# Validate arguments
|
|
shift 1
|
|
while [ "$#" -gt 0 ]; do
|
|
case "$1" in
|
|
-f|--file-mode)
|
|
shift
|
|
file_mode="${1:?missing mode for files}"
|
|
;;
|
|
-d|--dir-mode)
|
|
shift
|
|
dir_mode="${1:?missing mode for directories}"
|
|
;;
|
|
-u|--user)
|
|
shift
|
|
user="${1:?missing user}"
|
|
;;
|
|
-g|--group)
|
|
shift
|
|
group="${1:?missing group}"
|
|
;;
|
|
*)
|
|
LOG_E "Invalid command line flag $1" >&2
|
|
return 1
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
read -r -a filepaths <<< "$paths"
|
|
for p in "${filepaths[@]}"; do
|
|
if [[ -e "$p" ]]; then
|
|
LOG_D "Check directory $p"
|
|
if [[ -n $dir_mode ]]; then
|
|
LOG_D "Change permissions to 755 of directories in $p"
|
|
find -L "$p" -type d -exec chmod "$dir_mode" '{}' +
|
|
fi
|
|
if [[ -n $file_mode ]]; then
|
|
LOG_D "Change permissions to 755 of files in $p"
|
|
find -L "$p" -type f -exec chmod "$file_mode" '{}' +
|
|
fi
|
|
if [[ -n $user ]] && [[ -n $group ]]; then
|
|
LOG_D "Change ownership to ${user}:${group} of files and directories in $p"
|
|
find -L "$p" \! -user ${user} -or \! -group ${group} -exec chown -L "$user":"$group" '{}' +
|
|
elif [[ -n $user ]] && [[ -z $group ]]; then
|
|
LOG_D "Change user to ${user} of files and directories in $p"
|
|
find -L "$p" \! -user ${user} -exec chown -L "$user" '{}' +
|
|
elif [[ -z $user ]] && [[ -n $group ]]; then
|
|
LOG_D "Change groupto ${group} of files and directories in $p"
|
|
find -L "$p" \! -group ${group} -exec chgrp -L "$group" '{}' +
|
|
fi
|
|
else
|
|
LOG_E "$p does not exist"
|
|
fi
|
|
done
|
|
} |