在这里寻找效率

时间:2013-06-26 06:57:17

标签: shell

所以我有一个相当简单但写得非常糟糕的脚本来递归搜索目录,将.zips中的.zips提取到它们所在的文件夹中,并对提取的文件进行基本的错误检查和清理。为了记录,我完全缺乏能力,这个业务很好地说明了创建一个文件作为标志,以便从读取管道结构中获取信息。说实话,很快就会想到它从第一次尝试就起作用了,实际上并没有让文件混乱,所以我就把它留下了。我真的没有使用脚本的经验,除了玩C ++之外没有太多的经验,但是我正在努力让人觉得将shell编写成实际目的。问题是,即使我可以看到没有什么优雅的我如何做到这一点,而且搜索需要很长时间(比进入和列出目录本身更长)我真的不喜欢知道什么在减慢它。

我可以看到解压缩文件每个文件至少被调用几次,但它不像很多.zips的问题,而不是很多文件夹。是否有一些简单的我在清理这个问题方面错过了,或者我只是遇到了文件系统的现实(此时,通过搜索和提取在Windows上手动半自动执行此过程比自动化更快Linux *的)?更好的选择是接受这需要花费大量时间,让它在后台运行并将所有输出转储到日志中吗?

在任何情况下,如果你想涉及到这个,我的unzipr脚本的完整代码如下。

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相同的事情放置,更不用说自动了。

2 个答案:

答案 0 :(得分:0)

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

我从17年开始每天使用shell,但对于这样的脚本,我使用python。

答案 1 :(得分: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