如何编写批量设置权限的脚本

wen 实用脚本 1

本文目录导读:

如何编写批量设置权限的脚本

  1. Linux 文件权限批量设置脚本
  2. 更灵活的权限设置脚本
  3. Python 版本脚本
  4. 使用示例
  5. 注意事项

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

注意事项

  1. 测试环境先行:在正式环境使用前先在测试目录验证
  2. 备份重要数据:执行前备份重要文件
  3. 权限最简化:遵循最小权限原则
  4. 日志记录:建议添加操作日志
  5. 错误处理:添加完善的错误处理机制

这些脚本可以根据具体需求进行修改和扩展,选择哪种方案取决于你的具体使用场景和熟练程度。

抱歉,评论功能暂时关闭!