首页 > 解决方案 > 我可以做一个循环而不是两个循环吗?

问题描述

我在 ${MY_DIR} 有一个文件列表。

ABC_foo123.txt
ABC_foo456.txt
ABC_bar100.txt

需要对这些文件做一些操作。

我的代码:

#!/usr/bin/ksh

ls -l ${MY_DIR}/ABC_foo*.txt
RV=$?
if [[ $RV -eq 0 ]];then
        echo "files found for processing"
        for sFile in `ls -1 ${MY_DIR}/ABC_foo*.txt`
do
        fileNameOnly=$(basename ${sFile})
        echo processing $sFile
        #Doing some operations here
done
else
    echo "No foo files found to process"
fi

ls -l ${MY_DIR}/ABC_bar*.txt
RV=$?
if [[ $RV -eq 0 ]];then
        echo "files found for processing"
        for sFile in `ls -1 ${MY_DIR}/ABC_bar*.txt`
do
        fileNameOnly=$(basename ${sFile})
        echo processing $sFile
        #Doing some operations here
done
else
    echo "No bar files found to process"
fi

这是按预期进行的。但是,有没有一种方法可以使用一个循环而不是两个循环。我觉得我在做同样的事情两次。欢迎任何建议

标签: shellfor-loopunixksh

解决方案


不确定ksh,但bash你可以这样做:

for sFile in ABC_{foo,bar}*.txt; do 

在通用外壳中,您可以简单地执行以下操作:

for sFile in ABC_foo*.txt ABC_bar*.txt; do 

要检查是否已处理任何文件,执行以下操作可能更清洁:

flag=0
for sFile in "${MY_DIR}"/ABC_foo*.txt "${MY_DIR}"/ABC_bar*.txt; do
    flag=1
    # process sFile
done
if test "$flag" = 0; then echo "error" >&2; done

使用 glob 可以防止由于过滤 的输出而产生的许多错误ls,但可能会在非常大的目录(例如,具有数十万条目的目录)中遇到问题。如果这是一个问题,您可能想查看find.


推荐阅读