如何优化gzip压缩tar备份目录的文件检索并按新旧顺序搜索
问题解决方案
1. 更优的tar.gz备份包文件检索方式
临时检索优化
你现有命令的主要问题是会输出所有遍历过的备份包名,且解压检索逻辑可以精简,优化后可以做到仅输出匹配到目标文件的备份包及对应文件信息,减少无效输出:
# 单条精简命令版本,仅输出匹配结果 find . -name "Backup_*.tar.gz" -exec bash -c 'res=$(tar -ztvf "{}" | grep "CreatePackageCommand.php"); [ -n "$res" ] && echo "=== {} ===" && echo "$res"' \;
如果需要更高的检索效率,建议给备份做预生成索引:在你的每小时自动备份脚本中,生成tar.gz包后追加一行命令,提前把包内的文件列表导出为同名索引文件:
# 备份脚本中添加,假设变量$bak_file是生成的备份包路径 tar -ztvf "$bak_file" > "${bak_file}.list"
后续检索时直接查索引文件,无需重复解压tar包,速度可以提升10倍以上,检索命令如下:
find . -name "Backup_*.tar.gz.list" -exec bash -c 'res=$(grep "CreatePackageCommand.php" "{}"); [ -n "$res" ] && echo "=== ${1%.list} ===" && echo "$res"' _ {} \;
2. 按备份包从新到旧的顺序检索
你的备份包是每小时自动生成的,直接按文件的修改时间倒序排列即可实现从新到旧检索,有两种实现方式:
方式一(适合无特殊字符的标准文件名)
用ls -t直接按修改时间倒序列出备份包,配合循环处理:
# 按最新到最旧排序检索,仅输出匹配结果 for bak in $(ls -1t Backup_*.tar.gz); do match=$(tar -ztvf "$bak" | grep "CreatePackageCommand.php") if [ $? -eq 0 ]; then echo "=== 备份包:$bak ===" echo "$match" echo # 若只需要找最新的匹配包,取消下面的注释,找到后直接停止遍历 # break fi done
方式二(兼容所有文件名格式,更稳妥)
用find输出文件的时间戳,排序后再处理,不受文件名格式影响:
find . -maxdepth 1 -name "Backup_*.tar.gz" -printf "%T@ %p\n" | sort -nr | cut -d' ' -f2- | xargs -I {} bash -c 'res=$(tar -ztvf "{}" | grep "CreatePackageCommand.php"); [ -n "$res" ] && echo "=== {} ===" && echo "$res"'
内容的提问来源于stack exchange,提问作者Ken Brill
相关产品推荐
相关产品推荐

