BASH-在for循环问题中查找文件

时间:2019-04-30 12:15:12

标签: bash for-loop extension-methods

因此问题如下: 我有一个文件夹,其中所有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移出了原始文件夹?

还有其他想法吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

问题出在第一次迭代结束时,您最终位于另一个目录中。以下是一种可能的解决方法。

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

请注意,您的函数命名/模块化效果不佳。例如check_md5的功能远不只是检查md5的总和。