我在下面有此脚本,该脚本将被拖延和触发,可能是数百次,如果不是数百次,则不同用户。
脚本使用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")