0

所以我有一个相当简单但编写得非常糟糕的脚本来递归搜索目录,将其中的 .zip 提取到它们所在的文件夹中,并对提取的文件进行基本的错误检查和清理。作为记录,我完全没有能力通过创建一个文件作为标志来从 while read 管道结构中获取信息的业务很好地说明了这一点。老实说,它从第一次尝试就很快就想到了它,并且实际上并没有留下文件混乱,所以我就不管它了。我真的没有编写脚本的经验,而且除了玩弄 C++ 之外,一般情况下也没有太多经验,但我正在努力了解如何编写 shell 脚本以达到实际目的。问题是,即使我可以看到我如何做到这一点也没有什么优雅的,

我可以看到 unzip 每个文件至少被调用了几次,但与其说是大量 .zip 的问题,不如说是大量包含大量文件的文件夹。在清理这个方面我是否遗漏了一些简单的事情,或者我只是遇到了文件系统的现实(此时,在 Windows 上使用搜索和提取半手动执行此过程比在linux*)? 更好的选择是接受这将花费大量时间,使其在后台运行并将所有输出转储到日志中吗?

无论如何,如果您想深入了解,我的解压缩脚本的完整代码如下。

echo "" >> unzipr.log
echo "----" >> unzipr.log
echo " " >> unzipr.log
find . -name "*.zip" | while read filename; do 
    dir=$(dirname $filename)
    unzip -nqq "$filename" -d "$dir"
    if [[ $? == 0 ]] ; then 
        rm $filename
        echo "$filename succesfully extracted"
    else
        #unzip -t "$filename"
        echo "Error in $filename"
        echo $filename >> unzipr.log
        failed=true
        echo >> unzipr.fail
    fi ;
done
if [ -e unzipr.fail ] ; then
    echo "EXTRACTION ERRRORS DETECTED"
    rm unzipr.fail
    exit 1
else
    echo "Extraction successful"
    exit 0
fi

*我突然想到,我正在利用 Windows 搜索索引这些搜索...我可能不得不回到这里的绘图板,不知道如何首先用 Linux 做一些等效的事情,让自动单独。

4

2 回答 2

0

不幸的是,没有进行认真优化的空间。您脚本的逻辑非常简单。从理论上讲,您可以并行解压缩文件并清理失败的文件,但是我相信性能不会有显着差异。

所以我的修复很简单,unzipr.fail 文件在这里是多余的

echo "" >> unzipr.log
echo "----" >> unzipr.log
echo " " >> unzipr.log
find . -name "*.zip" | while read filename; do 
    dir=$(dirname $filename)
    unzip -nqq "$filename" -d "$dir"
    if [[ $? == 0 ]] ; then 
        rm $filename
        echo "$filename succesfully extracted"
    else
        #unzip -t "$filename"
        echo "Error in $filename"
        echo $filename >> unzipr.log
        failed=true
    fi ;
done
if [ "$failed" ] ; then
    echo "EXTRACTION ERRRORS DETECTED"
    rm unzipr.fail
    exit 1
else
    echo "Extraction successful"
    exit 0
fi
于 2013-06-26T08:26:26.373 回答
0

如果你有很多文件,我想因为你使用了 shell,所以会产生很多开销。你启动了很多进程:dirname、unzip、rm。如果你运行命令“top”,我猜你会看到很多系统负载:操作系统需要启动太多进程。

自 17 年以来,我每天都使用 shell,但对于这样的脚本,我使用 python。

于 2013-06-26T07:05:51.310 回答