本文目录导读:

Linux 文件权限批量设置脚本
Bash 脚本示例
#!/bin/bash
# 批量设置文件权限脚本
# 使用方法: ./batch_chmod.sh
# 配置区域
TARGET_DIR="/path/to/your/directory"
FILE_PERMISSION="644" # 文件权限
DIR_PERMISSION="755" # 目录权限
OWNER="user:group" # 所有者:组
# 检查目录是否存在
if [ ! -d "$TARGET_DIR" ]; then
echo "错误: 目录 $TARGET_DIR 不存在"
exit 1
fi
echo "开始批量设置权限..."
# 设置目录权限
find "$TARGET_DIR" -type d -exec chmod $DIR_PERMISSION {} \;
# 设置文件权限
find "$TARGET_DIR" -type f -exec chmod $FILE_PERMISSION {} \;
# 设置所有者和组
if [ -n "$OWNER" ]; then
chown -R $OWNER "$TARGET_DIR"
fi
echo "权限设置完成!"
# 显示权限变更统计
echo "文件数量: $(find "$TARGET_DIR" -type f | wc -l)"
echo "目录数量: $(find "$TARGET_DIR" -type d | wc -l)"
更灵活的权限设置脚本
#!/bin/bash
# 高级批量权限设置工具
# 显示帮助
show_help() {
cat << EOF
用法: $0 [选项]
选项:
-d <directory> 指定目标目录
-f <perm> 文件权限 (默认: 644)
-dir <perm> 目录权限 (默认: 755)
-o <owner> 所有者 (如: user:group)
-e <extensions> 特定扩展名 (逗号分隔,如: .txt,.sh)
-v 显示详细信息
-h 显示帮助
示例:
$0 -d /var/www -f 664 -dir 775
$0 -d /data -e .log,.txt -f 600
$0 -d /project -o www-data:www-data
EOF
}
# 初始化变量
TARGET_DIR=""
FILE_PERM="644"
DIR_PERM="755"
OWNER=""
EXTENSIONS=""
VERBOSE=0
# 解析参数
while [ $# -gt 0 ]; do
case $1 in
-d) TARGET_DIR="$2"; shift 2 ;;
-f) FILE_PERM="$2"; shift 2 ;;
-dir) DIR_PERM="$2"; shift 2 ;;
-o) OWNER="$2"; shift 2 ;;
-e) EXTENSIONS="$2"; shift 2 ;;
-v) VERBOSE=1; shift ;;
-h) show_help; exit 0 ;;
*) echo "未知参数: $1"; show_help; exit 1 ;;
esac
done
# 验证必要参数
if [ -z "$TARGET_DIR" ]; then
echo "错误: 必须指定目标目录"
show_help
exit 1
fi
if [ ! -d "$TARGET_DIR" ]; then
echo "错误: 目录 $TARGET_DIR 不存在"
exit 1
fi
# 日志函数
log() {
if [ $VERBOSE -eq 1 ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
fi
}
echo "开始批量设置权限..."
log "目标目录: $TARGET_DIR"
log "文件权限: $FILE_PERM"
log "目录权限: $DIR_PERM"
# 统计变量
FILE_COUNT=0
DIR_COUNT=0
# 处理文件权限
if [ -n "$EXTENSIONS" ]; then
# 只处理指定扩展名的文件
IFS=',' read -ra EXT_ARRAY <<< "$EXTENSIONS"
for ext in "${EXT_ARRAY[@]}"; do
find "$TARGET_DIR" -type f -name "*$ext" | while read file; do
chmod "$FILE_PERM" "$file"
log "已设置文件权限: $file"
((FILE_COUNT++))
done
done
else
# 处理所有文件
while IFS= read -r file; do
chmod "$FILE_PERM" "$file"
log "已设置文件权限: $file"
((FILE_COUNT++))
done < <(find "$TARGET_DIR" -type f)
fi
# 处理目录权限
while IFS= read -r dir; do
chmod "$DIR_PERM" "$dir"
log "已设置目录权限: $dir"
((DIR_COUNT++))
done < <(find "$TARGET_DIR" -type d)
# 设置所有者
if [ -n "$OWNER" ]; then
chown -R "$OWNER" "$TARGET_DIR"
log "已设置所有者: $OWNER"
fi
echo "完成! 共设置 $FILE_COUNT 个文件, $DIR_COUNT 个目录"
Python 版本脚本
#!/usr/bin/env python3
"""
批量权限设置工具
用法: python3 batch_chmod.py /path/to/directory 755 644
"""
import os
import sys
import argparse
from pathlib import Path
def set_permissions(directory, dir_perm=0o755, file_perm=0o644, owner=None):
"""递归设置文件和目录权限"""
stats = {'files': 0, 'dirs': 0}
for root, dirs, files in os.walk(directory):
# 设置目录权限
for dir_name in dirs:
dir_path = Path(root) / dir_name
os.chmod(dir_path, dir_perm)
stats['dirs'] += 1
print(f"设置目录权限: {dir_path}")
# 设置文件权限
for file_name in files:
file_path = Path(root) / file_name
os.chmod(file_path, file_perm)
stats['files'] += 1
print(f"设置文件权限: {file_path}")
# 设置所有者
if owner:
try:
if ':' in owner:
user, group = owner.split(':')
os.chown(root, user, group)
else:
os.chown(root, owner, -1)
except PermissionError:
print(f"警告: 无法设置 {root} 的所有者")
return stats
def main():
parser = argparse.ArgumentParser(description='批量设置文件权限')
parser.add_argument('directory', help='目标目录')
parser.add_argument('-d', '--dir-perm', type=lambda x: int(x, 8),
default=0o755, help='目录权限 (八进制)')
parser.add_argument('-f', '--file-perm', type=lambda x: int(x, 8),
default=0o644, help='文件权限 (八进制)')
parser.add_argument('-o', '--owner', help='所有者 (user:group)')
parser.add_argument('-v', '--verbose', action='store_true', help='详细输出')
args = parser.parse_args()
if not os.path.exists(args.directory):
print(f"错误: 目录 {args.directory} 不存在")
sys.exit(1)
try:
stats = set_permissions(
args.directory,
args.dir_perm,
args.file_perm,
args.owner
)
print(f"\n完成! 共设置 {stats['files']} 个文件, {stats['dirs']} 个目录")
except PermissionError:
print("错误: 权限不足,请以root身份运行")
sys.exit(1)
except Exception as e:
print(f"错误: {str(e)}")
sys.exit(1)
if __name__ == "__main__":
main()
使用示例
基本用法
# 基本使用 chmod +x batch_chmod.sh ./batch_chmod.sh # 带参数使用 python3 batch_chmod.py /var/www -d 755 -f 644 # Web服务器目录 python3 batch_chmod.py /var/www/html -d 755 -f 644 -o www-data:www-data # 日志文件特殊权限 python3 batch_chmod.py /var/log/myapp -d 750 -f 640 -o admin:logs
注意事项
- 测试环境先行:在正式环境使用前先在测试目录验证
- 备份重要数据:执行前备份重要文件
- 权限最简化:遵循最小权限原则
- 日志记录:建议添加操作日志
- 错误处理:添加完善的错误处理机制
这些脚本可以根据具体需求进行修改和扩展,选择哪种方案取决于你的具体使用场景和熟练程度。