Unix Bash脚本-如何限制文件循环一次只能处理10个文件

klh5stk1  于 2023-01-20  发布在  Unix
关注(0)|答案(2)|浏览(214)

我把头往墙上撞,我肯定我只是太笨了。
我尝试使用lftp命令对监视文件夹中的文件运行for循环,基本上是一个备份和移动过程。但由于LFTP和循环的工作方式,如果我在所有操作完成之前处理目标上的文件,我会失败。
因此,我想做的是读取所有文件与 *.log,然后如果有说20个文件只处理10,那么在其下次运行过程中10个文件再次最终它将在一个点上的1个文件的时间。我可以循环通过一切罚款。只是似乎不能弄清楚如何只读取前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;
lf3rwulv

lf3rwulv1#

每个批处理只需要一个lftp连接。
同样,don't use upper case for private variablesquote your variables;另请参见Why is testing “$?” to see if a command succeeded or not, an anti-pattern?,并注意将诊断消息发送到标准错误,而不是标准输出。

files=(*.log)
for ((i=0; i<${#files[@]}; i+=10)); do
    slice=("${files[0]:$i:10}")
    slice=("${slice[@]/#/$LogPath/}")
    if { cat <<________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;
________EOF
        printf "mput %s\n" "${slice[@]}" 
        echo quit; } |
      lftp -p 2252 -u "$FTPUser,$FTPPass" "$Location"
    then
        rm "${slice[@]}"
    else
        echo "$0: Error for ${slice[@]}" >&2
    fi
done

Bash不允许一次性将切片和前缀替换结合在一个数组上,因此我们将当前切片复制到slice,以便在每个条目前面添加$LogPath/

jdgnovmf

jdgnovmf2#

使用数组:

cd "$LogPath"
files=( *.log )

if 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 ${files[@]:0:10}
    quit
EOF
then
    rm ${files[@]:0:10}
fi

解释

${files[@]:0:10}

是一个只检索前10个元素 * 参数扩展

相关问题