用linux shell 并发压缩多级目录下的图片的脚本,压缩图片保存到另一目录中,并保持目录结构
时间: 2023-12-06 10:45:27 浏览: 87
图片压缩工具,脚本压缩
可以使用 `find` 命令来遍历多级目录下的图片文件,然后使用 `tar` 命令进行压缩,最后将压缩文件保存到另一目录中并保持目录结构。
以下是一个示例脚本:
```bash
#!/bin/bash
# 原始图片目录
src_dir="/path/to/src_dir"
# 压缩后的图片保存目录
dst_dir="/path/to/dst_dir"
# 并发压缩的进程数
num_procs=4
# 查找原始图片目录下的所有图片文件,并将文件名保存到数组中
files=($(find "$src_dir" -type f \( -iname "*.png" -o -iname "*.jpg" -o -iname "*.jpeg" \)))
# 创建保存压缩文件的目录结构
mkdir -p "$dst_dir"
# 并发压缩图片
for (( i=0; i<${#files[@]}; i+=num_procs )); do
# 获取要压缩的文件列表
file_list="${files[@]:i:num_procs}"
# 使用 xargs 将文件列表作为参数传递给 tar 命令,并在后台运行
echo "${file_list[@]}" | xargs -P "$num_procs" -I % bash -c 'tar -czf "$dst_dir/${%/##*/}.tar.gz" "$@"' _ %
done
```
说明:
- `find "$src_dir" -type f \( -iname "*.png" -o -iname "*.jpg" -o -iname "*.jpeg" \)` 查找 `$src_dir` 目录下所有类型为 PNG、JPG 和 JPEG 的图片文件,并将文件名保存到数组 `files` 中。
- `mkdir -p "$dst_dir"` 创建保存压缩文件的目录结构,如果目录已经存在则不会报错。
- `for (( i=0; i<${#files[@]}; i+=num_procs ))` 循环遍历 `files` 数组,每次取出 `num_procs` 个文件进行压缩。
- `echo "${file_list[@]}" | xargs -P "$num_procs" -I % bash -c 'tar -czf "$dst_dir/${%/##*/}.tar.gz" "$@"' _ %` 使用 `xargs` 命令将 `file_list` 数组中的文件名作为参数传递给 `tar` 命令,并在后台执行。其中 `${%/##*/}` 表示从文件路径中获取文件名,`-P "$num_procs"` 表示并发执行的进程数,`-I %` 表示将参数替换为 `%`,`_ %` 表示将 `_` 作为命令的 `$0` 参数,`"$@"` 表示将所有参数传递给 `tar` 命令。
阅读全文