[Topic DIscussion] 求高手帮忙优化Shell脚本
Tofloor
poster avatar
乐阿兰那
deepin
2021-02-07 23:11
Author

编了一个在安卓手机,终端上运行的Shell脚本,执行效率不高,运行耗时。想优化提速。
请高手指点。

 

# 查找小于300k且15天内没有被访问/修改过的文件(atim -n,n天内没被访问过;atim +n,n天之前没被访问过)

echo "   开始清理SD卡中影音图片小文件,稍等..."
smallfile_1[0]=`$find_2 $sd \( -path $sd/Books -o -path $sd/DCIM -o -path $sd/Download -o -path $sd/Pictures -o -path $sd/WechatXposed \) -prune -o \( -atime +15 -o -mtime +15 \) -type f -size -300k 2>/dev/null|sed -e '/.nomedia/ d' -e '/\/0\/Books/ d' -e '/\/0\/DCIM/ d' -e '/\/0\/Download/ d' -e '/\/0\/Pictures/ d' -e '/\/0\/WechatXposed/ d' -e '/\/0\/com.tencent.tmgp.sgame/ d' -e '/\/MIUI\/theme\/.data/ d'` &
smallfile_1[1]=`$find_2 /data/data \( -atime +15 -o -mtime +15 \) -type f -size -300k 2>/dev/null|sed -e '/.nomedia/ d'` &
for smallfile_2 in ${smallfile_1[*]};do
    { smallfile_3=`file "$smallfile_2" 2>/dev/null | $awk_2 '{print $2}'`;
    [[ $smallfile_3 == "empty" || $smallfile_3 == "BMP" || $smallfile_3 == "GIF" || $smallfile_3 == "ICO" || $smallfile_3 == "JPEG" || $smallfile_3 == "JPG" || $smallfile_3 == "PCX" || $smallfile_3 == "PNG" || $smallfile_3 == "SWF" || $smallfile_3 == "SVG" || $smallfile_3 == "TIF" || $smallfile_3 == "TIFF" || $smallfile_3 == "WEBP" || $smallfile_3 == "WMF" || $smallfile_3 == "3GP" || $smallfile_3 == "AAC" || $smallfile_3 == "ASF" || $smallfile_3 == "ASX" || $smallfile_3 == "AVI" || $smallfile_3 == "FLAC" || $smallfile_3 == "FLV" || $smallfile_3 == "MKV" || $smallfile_3 == "MPEG" || $smallfile_3 == "MP3" || $smallfile_3 == "MP4" || $smallfile_3 == "WMV" ]] && (rm -f \"$smallfile_2\" 1>/dev/null 2>>$sd/adzw_7_err.txt;[[ $? == "0" ]] && echo $smallfile_2 >>$sd/adzw_7.txt);} &
done
Reply Favorite View the author
All Replies
avatar
乐阿兰那
deepin
2021-02-07 23:15
#1

Reply View the author
avatar
Feng Yu
deepin
2021-02-07 23:22
#2

就不能按照代码方式粘贴吗?一会截图一会乱文本的,想优化都没兴趣继续看了

Reply View the author
avatar
element
deepin
2021-02-08 00:02
#3

发帖哪里选择插入代码  你这样没有格式化 不好看呀

Reply View the author
avatar
乐阿兰那
deepin
2021-02-08 04:47
#4
Feng Yu

就不能按照代码方式粘贴吗?一会截图一会乱文本的,想优化都没兴趣继续看了

已经按代码插入了,但没得Shell脚本语言的选项

Reply View the author
avatar
乐阿兰那
deepin
2021-02-08 04:47
#5
element

发帖哪里选择插入代码  你这样没有格式化 不好看呀

谢谢了

Reply View the author
avatar
Feng Yu
deepin
2021-02-08 08:39
#6

懒得手写了,这个优化实在没什么技术含量。说一下思路好了。你会觉得慢是因为你用了时间复杂度最高的方式,迭代所有符合条件的文件一个个删,文件越多速度越慢。

 

解决方案也特别简单,因为rm命令本身支持跟多个文件秒删,因此你需要构建出合适的rm -f的命令行即可,最常见的解决方案就是使用xargs构建这个命令行,你把你那乱七八糟的查询条件完全可以合并成一个find命令,然后使用find | xargs这种组合构建出rm命令行执行即可,无论文件多少都可以秒删。以上

Reply View the author
avatar
i8520
deepin
2021-02-08 17:50
#7
smallfile_1[0]

这种不要用到脚本里

这种你就写PY的脚本

用SH  就简单一点 一行一行 再多行都秒过,闪一下脚本就运行玩了

Reply View the author
avatar
乐阿兰那
deepin
2021-02-08 18:40
#8
Feng Yu

懒得手写了,这个优化实在没什么技术含量。说一下思路好了。你会觉得慢是因为你用了时间复杂度最高的方式,迭代所有符合条件的文件一个个删,文件越多速度越慢。

 

解决方案也特别简单,因为rm命令本身支持跟多个文件秒删,因此你需要构建出合适的rm -f的命令行即可,最常见的解决方案就是使用xargs构建这个命令行,你把你那乱七八糟的查询条件完全可以合并成一个find命令,然后使用find | xargs这种组合构建出rm命令行执行即可,无论文件多少都可以秒删。以上

请问find命令如何筛查文件类型(不依赖文件后缀名),因为我目的是删除小于300k的图片、视频类文件。目前,file命令能够查出文件类型。

因为采用的是字符串逐个比较,所以效率极低

Reply View the author
avatar
乐阿兰那
deepin
2021-02-08 23:46
#9
i8520
smallfile_1[0]

这种不要用到脚本里

这种你就写PY的脚本

用SH  就简单一点 一行一行 再多行都秒过,闪一下脚本就运行玩了

不会PY

Reply View the author
avatar
Feng Yu
deepin
2021-02-09 00:10
#10
乐阿兰那

请问find命令如何筛查文件类型(不依赖文件后缀名),因为我目的是删除小于300k的图片、视频类文件。目前,file命令能够查出文件类型。

因为采用的是字符串逐个比较,所以效率极低

man find

Reply View the author