首页 > 解决方案 > BASH - 在 for 循环问题中查找文件

问题描述

所以问题如下:我有一个包含 4 个 .zip 和 .md5 的文件夹,它们都具有相同的基本文件名。

我有一个 FOR 循环:

for S in *.zip;
do  
    {
        check_md5
    }
done

check_md5 ()
{
    if md5sum -c ${S:0:-4}.md5;
    then
        unzip_file
    else
        echo "MD5 failed"
    fi
}

问题:第一个 zip 的脚本运行良好,但是当 unzip_file 进程结束时,它不会将 S 变量更新为下一个 zip 的文件名。

在 unzip_file 过程中,它会移出原始文件夹,并在最后将当前的“S”.zip 和 .md5 移动到存档文件夹中。

是否有可能发生错误,因为 unzip_file 脚本移出原始文件夹,或者因为它在跳转到下一个周期之前将第一个 .zip 和 .md5 移出原始文件夹?

还有其他想法吗?

提前致谢。

标签: bashfor-loopextension-methods

解决方案


问题是在第一次迭代结束时,您最终会进入不同的目录。以下是一种可能的解决方法。

CWD="$PWD"  # remember current working directory path
for S in *.zip; do
    check_md5
    cd "$CWD"  # come back to the initial working directory at the end of each iteration
done

虽然与问题无关,但我更愿意将文件名传递给函数,而不是访问其他地方的变量集。我发现很难排除故障并且更容易出错。

unzip_file()
{
    echo "unzipping $1"
    # ...
}

check_md5()
{
    if md5sum -c "${1:0:-4}.md5"; then
        unzip_file "$1"  # pass the argument forward
    else
        echo "MD5 failed"
    fi
}

CWD="$PWD"  # remember current working directory path
for S in *.zip; do
    check_md5 "$S"  # pass file name as an argument
    cd "$CWD"  # come back to the initial working directory
done

另请注意,您的函数命名/模块化看起来并不好。egcheck_md5做的不仅仅是检查md5总和。


推荐阅读