--
:
--
:
--
772 字
4 分钟
-- 次
方案1 云服务器bash压缩脚本 小水管
最后更新于:
方案1-云服务器bash压缩脚本-小水管

目录
[toc]
背景
xgq写的转换成avif图片格式脚本。


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




环境
1centos7.x(本次是centos 7.6.1810)
源码
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 "*.jpeg" -o \
27 -iname "*.png" -o \
28 -iname "*.webp" \
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"
步骤
(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脚本

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

推荐使用支付宝

- 01博客和文档是否需要拆分开 2026-01-02
- 02是否需要站点个人主页 2026-01-02
- 03ai封面图 2026-01-02