--
:
--
:
--
1513 字
8 分钟
-- 次
方案1-图片转avif格式bash脚本-小水管
最后更新于:
方案1-图片转avif格式bash脚本-小水管

目录
[toc]
压缩方案
需求
1需求:
2我docs目录下有100个md文件(可能会含多个层级目录),目前的需求是,我想把这些md里的所有图片全部压缩成avif格式,然后再帮我把这些压缩后的图片都保存到docs目录下的new-images目录下。
3
4请帮我用python脚本实现下以上需求,要求无bug。
方案
1方案1:要么压缩全部图片)(9G ,2.6w多张)
2
3方案2:压缩目前hugo-teek博客里md用到的图片,然后手动移动到新图床里去
新图床存放图片标准
- 必须是
.avif格式的图片才行。(其它非此种格式图片、其他类型文件 均不允许存放)。- 七牛云图床里有的图片,我本地必须有;(因为我snowshot截图必须是先保存到本地,再上传到图床的)
https://img2.onedayxyy.cn/images/image-20251229222531.avif 七牛云+eo图床里的图片,新图床

背景
余温写的转换成avif图片格式脚本。


- 可以优化下的(在本地大配置虚机里)




环境
1centos7.x(本次是centos 7.6.1810)
源码
依赖于这个脚本和一个docker镜像:
(1)avif_convert.sh脚本内容:
1[root@hg-ecs imgs-convert-avif]#cat avif_convert.sh
2#!/bin/bash
3set -u
4
5# ====== 配置 ======
6SRC_DIR="/root/imgs-convert-avif/old-images"
7DST_DIR="/root/imgs-convert-avif/new-images"
8IMAGE_NAME="docker.cnb.cool/yuwen-gueen/docker-images-chrom/vips-avif:latest"
9
10LOG_DIR="/root/imgs-convert-avif/avif_logs"
11SUCCESS_LIST="$LOG_DIR/success.txt"
12FAILED_LIST="$LOG_DIR/failed.txt"
13RUN_LOG="$LOG_DIR/run.log"
14
15mkdir -p "$LOG_DIR"
16: > "$SUCCESS_LIST"
17: > "$FAILED_LIST"
18
19echo "====== AVIF 转换开始 $(date) ======" | tee -a "$RUN_LOG"
20
21cd "$SRC_DIR" || exit 1
22
23# ====== 主流程 ======
24find . -type f '(' \
25 -iname "*.jpg" -o \
26 -iname "*.avif" -o \
27 -iname "*.avif" -o \
28 -iname "*.avif" \
29')' | while read -r f; do
30
31 rel="${f#./}"
32 src_abs="$SRC_DIR/$rel"
33 dst_abs="$DST_DIR/${rel%.*}.avif"
34
35 mkdir -p "$(dirname "$dst_abs")"
36
37 # 已成功则跳过(容器内校验)
38 if [ -f "$dst_abs" ]; then
39 if docker run --rm \
40 -v "$DST_DIR:/dst" \
41 "$IMAGE_NAME" \
42 sh -c "vipsheader \"/dst/${rel%.*}.avif\" >/dev/null 2>&1"; then
43 echo "[SKIP] 已成功 $rel" | tee -a "$RUN_LOG"
44 echo "$rel" >> "$SUCCESS_LIST"
45 continue
46 fi
47 fi
48
49 echo "[DO] 转换 $rel" | tee -a "$RUN_LOG"
50
51 # 执行转换(低内存参数)
52 docker run --rm \
53 -e VIPS_CONCURRENCY=1 \
54 -e OMP_NUM_THREADS=1 \
55 -v "$SRC_DIR:/src:ro" \
56 -v "$DST_DIR:/dst" \
57 "$IMAGE_NAME" \
58 sh -c "
59 mkdir -p \"/dst/$(dirname "$rel")\" &&
60 vips heifsave \"/src/$rel\" \"/dst/${rel%.*}.avif\" \
61 --compression=av1 \
62 --Q=45 \
63 --speed=10
64 " >>"$RUN_LOG" 2>&1
65
66 # 二次校验
67 if docker run --rm \
68 -v "$DST_DIR:/dst" \
69 "$IMAGE_NAME" \
70 sh -c "vipsheader \"/dst/${rel%.*}.avif\" >/dev/null 2>&1"; then
71 echo "[OK] $rel" | tee -a "$RUN_LOG"
72 echo "$rel" >> "$SUCCESS_LIST"
73 else
74 echo "[FAIL] $rel" | tee -a "$RUN_LOG"
75 echo "$rel" >> "$FAILED_LIST"
76 rm -f "$dst_abs"
77 fi
78done
79
80echo "====== AVIF 转换结束 $(date) ======" | tee -a "$RUN_LOG"
81echo "成功: $(wc -l < "$SUCCESS_LIST")" | tee -a "$RUN_LOG"
82echo "失败: $(wc -l < "$FAILED_LIST")" | tee -a "$RUN_LOG"
(2)docker镜像
1docker save docker.cnb.cool/yuwen-gueen/docker-images-chrom/vips-avif:latest |gzip > vips-avif.tar.gz
百度盘链接:
2026.1.10-avif压缩脚本

步骤
(1)上传avif_convert.sh脚本到linu系统对应目录(本次我的测试目录位置为/root/imgs-convert-avif)
1cd /root
2mkdir imgs-convert-avif
3# rz avif_convert.sh
(2)创建如下2个目录
1cd /root/imgs-convert-avif
2mkdir avif_logs old-images
(3)执行脚本
1nohup /root/imgs-convert-avif/avif_convert.sh > /root/imgs-convert-avif/avif_logs/nohup.out 2>&1 &
(4)验证
1[root@hg-ecs imgs-convert-avif]#pwd
2/root/imgs-convert-avif
3[root@hg-ecs imgs-convert-avif]#ls
4avif_convert.sh avif_logs new-images old-images
5[root@hg-ecs imgs-convert-avif]#du -sh new-images/
6194M new-images/
7[root@hg-ecs imgs-convert-avif]#ps -ef|grep avif_convert.sh
8root 28092 1 0 00:36 ? 00:00:00 /bin/bash ./avif_convert.sh
9root 28098 28092 0 00:36 ? 00:00:25 /bin/bash ./avif_convert.sh
10root 31046 17716 0 10:30 pts/1 00:00:00 grep --color=auto avif_convert.sh
11[root@hg-ecs imgs-convert-avif]#ls new-images/|head -5
12003403f310424ad593ce0600e2b1e883.avif
13004F0BC7.avif
14047ffa6cb5bea8c537c6f1b470b4736f.avif
15055d99f2b10411b82536c11ddb9fb75.avif
160b960969c47d5f8bcad4392f00b6005.avif
17117b15b2413444228889623eec3f0f1f.avif
181200-1688890327934-4.avif
(5)耐心等待即可。😜
FAQ
这个脚本吃cpu的
自己可以根据自己机器的cpu核数来修改这里的大小,例如自己的虚机cpu核数为64的话,那么这里可以修改为
8*8。
编辑avif_convert.sh脚本:
1 docker run --rm \
2 -e VIPS_CONCURRENCY=1 \
3 -e OMP_NUM_THREADS=1 \


用node的sharp一行就完事了
2025年12月30日记录。

picgo里的插件转avif
2025年12月30日记录。

node脚本

压缩进度
1[root@hg-ecs imgs-convert-avif]#du -sh new-images/
2735M new-images/
3
4##失败的
5[root@hg-ecs imgs-convert-avif]#cat avif_logs/failed.txt |wc -l
696
7
8
9[root@hg-ecs imgs-convert-avif]#ls old-images/|wc -l
1026819
11[root@hg-ecs imgs-convert-avif]#
失败的图片名称(96张)
1[root@hg-ecs imgs-convert-avif]#cat avif_logs/failed.txt
257239663db3394f48cff0b0f2405e19.jpg
3image-20220912075558446.avif
4image-20250911001242799.avif
5IMG20250829220503.jpg
6IMG20250831155000.jpg
7c5d76050d07f3501de3dead60ff923a.jpg
83.avif
91a50e52a3570f11a4858e311016e05b.jpg
10IMG20250831002203.jpg
11IMG20250831191133.jpg
127.avif
131653386682452-1665408920624-6063-1694473679034-8.jpg
146ff6cd031923fc191c50b505d7fffd1-1694442268590-2-1699244475443-2946.jpg
15image-20250911002248767.avif
16image-20250922074724908.avif
176ff6cd031923fc191c50b505d7fffd1-1694442268590-2-1699244475443-2946-1700207240741-3.jpg
18image-20250928072333021.avif
19IMG20250831175908.jpg
20image-20231210084429.jpg
21image-20240316072010493.avif
227dd27685902a9c3aa3a4db53198de48.jpg
2366d9093516c9e93f1ee45037f7768c7.jpg
24IMG20250831183738.jpg
254e3285080192ac06a8a2d7aa539b553.jpg
26image-20240316123632393.avif
27goimgapi/images/5.avif
28goimgapi/images/10.avif
29Teek/TeekBg/5.avif
30Teek/TeekBg/23.avif
31Teek/TeekBg/10.avif
32Teek/TeekCover/12.avif
33Teek/性感壁纸/3.avif
34Teek/性感壁纸/7.avif
35Teek/性感壁纸/微信图片_20250916150343_18622_319.jpg
36Teek/性感壁纸/1.avif
37TeekBg/5.avif
38TeekBg/10.avif
39TeekCover/20.avif
40TeekCover/12.avif
4113.avif
4200954996a6be9f3e1de147b8f3f7130.jpg
43IMG20250829172651.jpg
44image-20240620121642035.avif
456ff6cd031923fc191c50b505d7fffd1-1694442268590-2-1699244475443-2946-1700207240732-2.jpg
46d34f6856f53123b59e5c3c0eeebbb85.jpg
47IMG20250830235055.jpg
48IMG20250906204921.jpg
49background23.jpg
50afcc0f5e8c42f2c2d7b8d78b3921bc6.jpg
51image-20240327062447187.avif
52image-20250830102645933.avif
53image-20240128103940379.avif
548.avif
5517.avif
56c1ed5bd1dfa9c1c484f9542f7122794.jpg
57618751583a425b59ea51b13772820d6.jpg
58IMG20250831154630.jpg
59sex-woman.avif
601.avif
61xyy-flower.jpg
62IMG20250830204254.jpg
632024-05-18_103923.avif
64image-20250911002838607.avif
6585bacb9d2b95f12f632dae074405bee.jpg
66IMG20250831000909.jpg
6710.avif
68goimgapi-v2/images/5.avif
69goimgapi-v2/images/17.avif
70goimgapi-v2/images/10.avif
71goimgapi-v2/images/15.avif
7215.avif
7312.avif
7416.avif
75b9a7ba4c20cf36caa9759327ac257c0.jpg
76image-20240420163439785.avif
771698216077763.jpg
782.avif
790b8deb817ba81fa39474689b576b88e.jpg
80a87982469884a3b58b617c70f893880.jpg
81IMG20250829183950.jpg
82IMG20250829171954.jpg
830a6c84ba11359f68caff78b23becde8.jpg
84nginx100-taohui.avif
85IMG20250831192819.jpg
86IMG20250831192907.jpg
87PixPin_2025-09-17_06-45-52.avif
88b4932774d4750facf6421765416ed84.jpg
896.avif
90IMG20250831194030.jpg
91Teekwebsite/��001��ʼ.jpg
92Teekwebsite/������IJ���..avif
93Teekwebsite/Javaȫջ֪ʶ���ϵϵ.jpg
94imgapi/5.avif
95imgapi/17.avif
96imgapi/10.avif
97imgapi/15.avif
98[root@hg-ecs imgs-convert-avif]#
把本地avif目录备份到云盘
2026.1.10-imgs-avif格式-备份-已上传到七牛云

当前图床备份状态

结束
📡
👤
作者:
One
🌐
版权:
本站文章除特别声明外,均采用
CC BY-NC-SA 4.0
协议,转载请注明来自
One Blog!
推荐使用微信支付

推荐使用支付宝

- 01ssg vs 动态博客 2026-01-22
- 02ssr 2026-01-22
- 03人机验证 2026-01-22