优化重复Bash循环脚本:实现目录文件压缩并删除源文件
优化Bash脚本并实现递归压缩方案
一、优化现有重复循环的脚本
原脚本用重复for循环处理每个目录,我们可以通过遍历目标目录列表或者匹配目录模式来简化代码,彻底消除冗余。
方案1:遍历指定目录数组
把需要处理的目录统一放到数组中,用单次循环完成所有操作:
#!/bin/bash # 定义需要处理的目标目录数组 target_dirs=(/home/gowmi/UserA /home/gowmi/UserB /home/gowmi/UserC) for dir in "${target_dirs[@]}"; do # 先检查目录是否存在,避免报错 if [ -d "$dir" ]; then # 压缩目录下的所有txt文件,gzip默认会删除源文件 gzip "$dir"/*.txt fi done
方案2:匹配目录通配符
如果目录命名有规律(比如都是User开头),直接用通配符匹配更简洁:
#!/bin/bash for dir in /home/gowmi/User*; do if [ -d "$dir" ]; then gzip "$dir"/*.txt fi done
二、实现递归压缩目录及文件
要递归处理所有子目录里的文件,有两种实用方式:
方式1:用find+gzip递归压缩单个文件
适合需要单独压缩每个文件、保留目录结构的场景:
#!/bin/bash # 递归压缩/home/gowmi下所有txt文件,压缩后自动删除源文件 find /home/gowmi -type f -name "*.txt" -exec gzip {} \;
-type f:仅处理文件,跳过目录-name "*.txt":匹配目标文件后缀,可根据需求修改-exec gzip {} \;:对每个找到的文件执行压缩操作
方式2:用tar递归打包压缩整个目录
适合需要把整个目录结构打包成单个压缩包的场景:
#!/bin/bash # 将/home/gowmi目录递归打包并压缩为gowmi_backup.tar.gz tar -czf gowmi_backup.tar.gz /home/gowmi # 如果需要压缩后删除原目录,添加--remove-files参数 # tar -czf gowmi_backup.tar.gz --remove-files /home/gowmi
-c:创建新的归档文件-z:使用gzip算法压缩-f:指定归档文件的名称
三、额外优化建议
- 添加错误处理,避免脚本静默失败:
if ! gzip "$dir"/*.txt; then echo "压缩目录$dir下的文件失败" >&2 fi
- 如果需要保留源文件,给
gzip添加-k参数(gzip -k file.txt)
内容的提问来源于stack exchange,提问作者Gowmi
相关产品推荐
相关产品推荐

