You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 13:10:26