方案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脚本

结束

推荐使用微信支付
微信支付二维码
推荐使用支付宝
支付宝二维码
最新文章

文档导航