BASH脚本优化



我在下面有此脚本,该脚本将被拖延和触发,可能是数百次,如果不是数百次,则不同用户。

脚本使用inotifywait观看一个文件夹以进行上传,然后在旋转(备份/移动)以前的上传后,将上传的文件移至最终目的地以进行演示。该代码将用于随时创建的不同上传文件夹。

#!/bin/bash
db="$VAR1"/path/to/upload/folder/
s3="$VAR2"/path/to/remote/folder
inotifywait -m -r -e attrib "$db" |
while read dir ev file;
do
        for dirnum in $(cd "$s3"; ls */*.png | sed 's%/.*%%' | sort -nr)
        do
                 next=$(($dirnum + 1));                       
                 mv "$s3/$dirnum/post$dirnum.png" "$s3/$next/post$next.png";
        done
        mv "$db"/"$file"  "$s3"/1/post1.png
done

我该怎么做才能优化它?还是应该改写更快的编程语言?另外,如何在一定量的负载下测试脚本?

这并不具有相同的行为,但它避免了排序:

#!/bin/bash
db="$VAR1"/path/to/upload/folder/
s3="$VAR2"/path/to/remote/folder
inotifywait -m -r -e attrib "$db" |
while read dir ev file;
do
    dirnum=1
    while test -e "$s3/$dirnum"; do : $(( dirnum += 1 )); done
    while test $dirnum -gt 0; do
        next=$(( dirnum + 1 ));    
        mkdir -p $s3/$next                   
        mv "$s3/$dirnum/post$dirnum.png" "$s3/$next/post$next.png"
        : $(( dirnum -= 1 ))
    done
    mv "$db/$file" "$s3"/1/post1.png
done

如果您跟踪存储到$s3的最高数字,则可以避免第一个环形。如果其他过程创建文件,这样做会稍微脆弱在$s3中,但是在这种情况下,即使在这种简单的解决方案中,您也有种族条件。不重命名文件要简单得多,而是将第一个文件上传到 $s3/1,下一个在 $s3/2中。在这种情况下,可以编写脚本:

#!/bin/bash
db="$VAR1"/path/to/upload/folder/
s3="$VAR2"/path/to/remote/folder
dirnum=1
while test -e "$s3/$dirnum"; do : $(( dirnum += 1 )); done
inotifywait -m -r -e attrib "$db" |
while read dir ev file;
do
    mkdir -p "$s3"/$dirnum
    mv "$db/$file" "$s3"/$dirnum/post$dirnum.png
    : $(( dirnum += 1 ))
done

您应该避免将新文件放入新目录并将旧文件放在旧目录中,以避免将如此多的文件移动。您可能需要扭转演示文稿逻辑,因此显示最新文件(最大数字),而不是每次post1.png。但是,您可以通过使其更少来加快它的速度 - 您可以通过使它离开已经孤独的东西来减少它。

如果某事还不够快,那么加速它的最佳方法之一就是退后一步并查看算法,看看是否有可以使用的算法更快的算法。如果您已经使用了最佳算法,那么您会查看如何加快该算法的详细信息,但是有时可以通过重新访问算法来获得数量级的改进,其中调整可能会使您的速度增加一倍。<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

您可以像这样重构脚本:

!/bin/bash
db="$VAR1"/path/to/upload/folder/
s3="$VAR2"/path/to/remote/folder
while read dir ev file
do
   while read dirnum
   do
      next=$(($dirnum + 1))
      mv "$s3/$dirnum/post$dirnum.png" "$s3/$next/post$next.png"
   done < <(find "$s3" -depth 2 -name "*.png" -exec dirname {} ; | sort -unr)
  mv "$db"/"$file"  "$s3"/1/post1.png
done < <(inotifywait -m -r -e attrib "$db")

相关内容

  • 没有找到相关文章

最新更新