用linux shell 并发压缩多层目录下的图片的脚本,压缩图片保存到另一目录中,
时间: 2023-12-06 22:44:57 浏览: 31
可以使用 `find` 命令找到多层目录下的所有图片,然后使用 `xargs` 命令调用 `gzip` 进行压缩。可以通过 `nohup` 命令将该命令放入后台执行,并将输出重定向到一个日志文件中。
以下是一个示例脚本:
```bash
#!/bin/bash
# 设置要压缩的文件类型
filetype="*.jpg *.jpeg *.png"
# 设置要搜索的起始目录和压缩后保存的目录
search_dir="/path/to/search"
compress_dir="/path/to/compress"
# 找到所有要压缩的文件并压缩
find "$search_dir" -type f -name "$filetype" -print0 | xargs -0 -P 4 -I {} sh -c 'gzip -c {} > "$compress_dir/$(basename {}).gz"'
# 将输出重定向到日志文件中
nohup ./compress.sh > compress.log &
```
在上面的脚本中,`-P` 参数指定了要启动的并发进程数,这里设置为 4。通过 `basename` 命令获取文件名,然后将压缩后的文件保存到指定目录中,并以 `.gz` 扩展名结尾。
你可以根据需要修改 `filetype`、`search_dir` 和 `compress_dir` 变量来适应你的需求。
相关问题
用linux shell 并发压缩多级目录下的图片的脚本,压缩图片保存到另一目录中,并保持目录结构
可以使用 `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` 命令。
写一个Linux shell脚本,查看目录下所有子目录占用空间
可以使用 `du` 命令来查看目录的大小,加上 `-h` 参数可以以易读的方式显示目录大小,加上 `-d` 参数可以指定查看的目录深度。结合 `find` 命令可以查找指定目录下的所有子目录。
下面是一个查看指定目录下所有子目录占用空间的 shell 脚本示例:
```bash
#!/bin/bash
# 指定要查看的目录
dir="/path/to/directory"
# 查找指定目录下的所有子目录,并遍历输出它们的空间占用情况
find "$dir" -type d -print0 | while read -d $'\0' path; do
# 使用 du 命令计算目录大小,并以易读的方式显示
size=$(du -sh "$path" | cut -f1)
echo "$size $path"
done
```
在上面的脚本中,`find` 命令会查找指定目录下的所有子目录,并将它们的路径以 null 字符 (`\0`) 分隔输出。接着使用 `while` 循环读取每个子目录的路径,并使用 `du` 命令计算它们的大小。最后将目录大小和路径输出。