webp 是 Google 推出的一种图片格式。相比其他常见格式,它的压缩效率更高。如果客户端浏览器支持,我们的网站就会发送 webp 格式的图片,从而减少传输的数据量。
参考网上的其他脚本,我写了这个批处理文件,用于将常见格式的图片批量转换为 webp 格式。该脚本会查找指定文件夹(包括所有子文件夹)中的全部图片文件,并在指定路径下建立对应的目录结构,用来存放转换后的 webp 文件。
脚本
#! /bin/bash
shopt -s nullglob # Globs that match nothing expand to nothing
shopt -s globstar # ** matches multiple directory levels
root_webp_dir=/path_to_webp_directory
www_base_dir=/path_to_root_directory
pushd "$www_base_dir"
[[ -d "$www_base_dir" ]] || exit 1
for jpg_path in ./**/*.{png,jpg,jpeg} ; do
jpg_file=${jpg_path##*/}
[[ $jpg_path == */* ]] && jpg_dir=${jpg_path%/*} || jpg_dir=.
webp_dir=${root_webp_dir}/${jpg_dir}
webp_path=${webp_dir}/${jpg_file}.webp
[[ -d "$webp_dir" ]] || mkdir -p -- "$webp_dir"
if [ ! -e "$webp_path" ] || [ "$jpg_path" -nt "$webp_path" ]
then
if [[ $jpg_file == *.gif ]]
then
gif2webp -lossy -q 80 -m 6 "$jpg_path" -o "$webp_path"
else
cwebp -q 75 -m 6 -af "$jpg_path" -o "$webp_path"
fi
else
echo "exists: $webp_path"
fi
done
echo "$root_webp_dir/**/*.{webp}"
for w_path in $root_webp_dir/**/*.webp ; do
j_path=.${w_path#"$root_webp_dir"}
j_path=${j_path%.webp}
#echo "j_path: $j_path"
if [ ! -e "$j_path" ]
then
echo "remove: $w_path"
rm "$w_path"
fi
done
popd用法
根据需要修改这两个路径:一个是存放 webp 的文件夹,另一个是存放原始图片的文件夹。
root_webp_dir=/path_to_webp_directory
www_base_dir=/path_to_root_directory因为 webp 格式的图片可能比 gif 还大,上面的脚本默认不转换 gif 图片。如果需要转换 gif,把第一条 for 语句改为
for jpg_path in ./**/*.{png,jpg,jpeg,gif} ; do若指定的 root_webp_dir 目录中有某张 webp 图片,而 www_base_dir 中没有同名图片,上面的脚本会删除 root_webp_dir 目录中的这张 webp 图片。若不需要此功能,请删掉下面的代码。
for w_path in $root_webp_dir/**/*.webp ; do
j_path=.${w_path#"$root_webp_dir"}
j_path=${j_path%.webp}
#echo "j_path: $j_path"
if [ ! -e "$j_path" ]
then
echo "remove: $w_path"
rm "$w_path"
fi
done祝使用愉快 🙂
0 条评论