Unix Bash脚本:如何限制for循环每次仅处理10个文件
批量处理日志文件并分批迁移的解决方案
问题背景
需要通过lftp分批迁移监控文件夹中的*.log文件,比如20个文件时先处理前10个,下次运行处理剩余的,避免因目标端文件未处理完成导致的失败,但当前脚本会遍历所有文件,无法实现分批处理。
原脚本如下:
for FILE in *.log; do lftp -p 2252 -u $FTPUser,$FTPPass $Location <<EOF set ftp:ssl-allow no set xfer:use-temp-file on set xfer:temp-file-name *.tmp set log:file/xfer /log/LFTP_$FILE.log; mput $LogPath/$FILE quit EOF if [ $? == "0" ]; then rm $LogPath/$FILE else echo "Error" fi done;
解决方案
要实现每次只处理前N个文件(比如10个),可以通过以下两种方式修改脚本:
方法1:用ls+head获取指定数量文件
先提取前N个日志文件存入数组,再逐个处理,适配含空格的文件名:
# 设置每次处理的文件数量 BATCH_SIZE=10 # 将前BATCH_SIZE个.log文件存入数组 mapfile -t FILES < <(ls -1 *.log | head -n $BATCH_SIZE) # 遍历数组处理文件 for FILE in "${FILES[@]}"; do lftp -p 2252 -u $FTPUser,$FTPPass $Location <<EOF set ftp:ssl-allow no set xfer:use-temp-file on set xfer:temp-file-name *.tmp set log:file/xfer /log/LFTP_$FILE.log; mput $LogPath/$FILE quit EOF if [ $? -eq 0 ]; then rm "$LogPath/$FILE" else echo "处理文件 $FILE 失败" fi done
ls -1 *.log:按行输出所有.log文件head -n $BATCH_SIZE:截取前10个文件mapfile -t FILES:将结果存入数组,避免文件名含空格时出现解析错误
方法2:用计数器控制循环次数
在原循环中加入计数器,达到指定数量后终止循环:
BATCH_SIZE=10 COUNT=0 for FILE in *.log; do # 达到批量数量则退出循环 if [ $COUNT -ge $BATCH_SIZE ]; then break fi lftp -p 2252 -u $FTPUser,$FTPPass $Location <<EOF set ftp:ssl-allow no set xfer:use-temp-file on set xfer:temp-file-name *.tmp set log:file/xfer /log/LFTP_$FILE.log; mput $LogPath/$FILE quit EOF if [ $? -eq 0 ]; then rm "$LogPath/$FILE" else echo "处理文件 $FILE 失败" fi COUNT=$((COUNT+1)) done
- 每处理一个文件计数器加1,当计数器达到
BATCH_SIZE时,用break停止处理后续文件
注意事项
- 若文件名包含空格或特殊字符,优先使用方法1的数组方式
- 可根据需求调整
BATCH_SIZE的值,最后一次剩余文件不足指定数量时,脚本会自动处理所有剩余文件 - 确保
$LogPath路径正确,避免误删或上传错误文件
内容的提问来源于stack exchange,提问作者Digi
相关产品推荐
相关产品推荐

