本文目录导读:

我来详细介绍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"
使用建议
- 添加错误处理:检查文件是否存在、权限等
- 使用日志记录:记录处理过程和结果
- 谨慎使用删除操作:添加确认机制
- 考虑性能:大量文件时使用适当的批处理策略
- 做好备份:重要操作前先备份
Shell脚本的批处理非常灵活,可以根据具体需求组合使用上述方法。