Shell脚本如何实现批处理

wen 实用脚本 1

本文目录导读:

Shell脚本如何实现批处理

  1. 基础批处理结构
  2. 文件重命名批处理
  3. 文本处理批处理
  4. 目录操作批处理
  5. 使用find命令批处理
  6. 带参数批处理脚本
  7. 并行处理示例
  8. 实战案例:日志分析批处理
  9. 使用建议

我来详细介绍Shell脚本实现批处理的几种常见方式:

基础批处理结构

循环处理文件

#!/bin/bash
# 批量处理当前目录下所有.txt文件
for file in *.txt; do
    echo "处理文件: $file"
    # 执行处理操作,
    wc -l "$file" > "${file%.txt}_统计.txt"
done

批量处理指定文件列表

#!/bin/bash
# 批量处理多个文件
for file in file1.txt file2.txt file3.txt; do
    if [ -f "$file" ]; then
        echo "正在处理: $file"
        # 添加你的处理命令
        cat "$file" | grep "keyword" > "output_$file"
    fi
done

文件重命名批处理

#!/bin/bash
# 批量重命名:将.jpg改为.png
for file in *.jpg; do
    if [ -f "$file" ]; then
        mv "$file" "${file%.jpg}.png"
        echo "重命名: $file -> ${file%.jpg}.png"
    fi
done
# 添加前缀/后缀
for file in *.txt; do
    mv "$file" "prefix_$file"
    # 或添加后缀:mv "$file" "${file%.txt}_suffix.txt"
done

文本处理批处理

#!/bin/bash
# 批量替换文件内容
for file in *.config; do
    sed -i 's/old_value/new_value/g' "$file"
    echo "已修改: $file"
done
# 批量提取数据
for file in *.log; do
    # 提取错误信息
    grep "ERROR\|FATAL" "$file" > "error_$file"
    # 统计行数
    wc -l "$file" >> summary.txt
done

目录操作批处理

#!/bin/bash
# 批量创建目录
for i in {1..10}; do
    mkdir -p "project_$i"/{src,docs,tests}
    echo "创建目录: project_$i"
done
# 批量处理子目录
for dir in */; do
    if [ -d "$dir" ]; then
        cd "$dir"
        echo "进入目录: $dir"
        # 执行某个命令
        make clean
        cd ..
    fi
done

使用find命令批处理

#!/bin/bash
# 查找并批量删除.tmp文件
find . -name "*.tmp" -type f -exec rm {} \;
# 查找并批量修改权限
find . -type f -name "*.sh" -exec chmod +x {} \;
# 查找并批量处理
find /data -name "*.log" -mtime +7 -type f | while read file; do
    echo "压缩旧日志: $file"
    gzip "$file"
done

带参数批处理脚本

#!/bin/bash
# 批量处理脚本,支持参数
usage() {
    echo "用法: $0 [-d directory] [-p pattern] [-a action]"
    echo "  -d: 目标目录"
    echo "  -p: 文件匹配模式"
    echo "  -a: 操作类型 (rename, backup, delete)"
    exit 1
}
while getopts "d:p:a:" opt; do
    case $opt in
        d) DIRECTORY="$OPTARG" ;;
        p) PATTERN="$OPTARG" ;;
        a) ACTION="$OPTARG" ;;
        *) usage ;;
    esac
done
if [ -z "$DIRECTORY" ] || [ -z "$PATTERN" ] || [ -z "$ACTION" ]; then
    usage
fi
cd "$DIRECTORY" || exit 1
case $ACTION in
    rename)
        for file in $PATTERN; do
            mv "$file" "backup_$file"
        done
        ;;
    backup)
        mkdir -p backup
        cp $PATTERN backup/
        ;;
    delete)
        read -p "确认删除这些文件? [y/N] " confirm
        if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then
            rm $PATTERN
        fi
        ;;
    *)
        echo "未知操作"
        exit 1
        ;;
esac

并行处理示例

#!/bin/bash
# 并行处理多个文件
process_file() {
    local file="$1"
    echo "处理: $file (PID: $$)"
    sleep 2  # 模拟处理时间
    echo "$file 处理完成"
}
# 并行执行
for file in *.txt; do
    process_file "$file" &
done
# 等待所有后台进程完成
wait
echo "所有文件处理完成"

实战案例:日志分析批处理

#!/bin/bash
# 批量日志分析脚本
LOG_DIR="/var/log"
REPORT_DIR="./reports"
mkdir -p "$REPORT_DIR"
analyze_log() {
    local logfile="$1"
    local basename=$(basename "$logfile")
    echo "分析: $logfile"
    # 统计不同级别的日志
    echo "=== $basename 分析报告 ===" > "$REPORT_DIR/${basename}_report.txt"
    echo "ERROR数量: $(grep -c 'ERROR' "$logfile")" >> "$REPORT_DIR/${basename}_report.txt"
    echo "WARN数量: $(grep -c 'WARN' "$logfile")" >> "$REPORT_DIR/${basename}_report.txt"
    echo "INFO数量: $(grep -c 'INFO' "$logfile")" >> "$REPORT_DIR/${basename}_report.txt"
    # 提取关键错误
    grep 'ERROR' "$logfile" | sort | uniq -c | sort -rn | head -5 >> "$REPORT_DIR/${basename}_errors.txt"
}
# 批量处理
for log in "$LOG_DIR"/*.log; do
    if [ -f "$log" ] && [ -r "$log" ]; then
        analyze_log "$log"
    fi
done
echo "分析完成,报告保存在: $REPORT_DIR"

使用建议

  1. 添加错误处理:检查文件是否存在、权限等
  2. 使用日志记录:记录处理过程和结果
  3. 谨慎使用删除操作:添加确认机制
  4. 考虑性能:大量文件时使用适当的批处理策略
  5. 做好备份:重要操作前先备份

Shell脚本的批处理非常灵活,可以根据具体需求组合使用上述方法。

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