Linux如何使用find命令查找同名备份文件并仅保留最新版删除旧文件
备份文件清理方案(仅保留最新1个)
核心思路
遍历所有匹配的backupname.tar.gz文件,按修改时间从新到旧排序,排除最新的1个后删除剩余所有文件,全程处理特殊文件名(含空格、换行等)避免出错。
通用Linux(GNU环境)实现命令
find . -type f -name "backupname.tar.gz" -printf "%T@ %p\0" | sort -z -k1,1nr | sed -z '1d' | cut -z -d ' ' -f2- | xargs -0 rm -f
命令分段说明
find . -type f -name "backupname.tar.gz" -printf "%T@ %p\0":递归查找当前目录下所有名为backupname.tar.gz的普通文件,输出「文件修改时间戳+文件路径」,用空字符作为分隔符规避特殊文件名的解析问题sort -z -k1,1nr:按时间戳从大到小排序(即最新的文件排在最前面)sed -z '1d':删除排序后的第一条结果,也就是保留最新的文件cut -z -d ' ' -f2-:剥离时间戳字段,仅保留文件路径xargs -0 rm -f:将待删除的文件路径传给rm命令执行删除
macOS/BSD环境兼容命令
BSD系的find没有-printf参数,改用stat获取时间戳:
find . -type f -name "backupname.tar.gz" -exec stat -f "%m %N" {} \; | sort -k1,1nr | sed '1d' | cut -d ' ' -f2- | xargs rm -f
安全验证与拓展
- 执行删除前可以把命令末尾的
rm -f替换为ls -l,预览待删除的文件列表,确认无误后再执行删除操作,避免误删 - 如果需要每个包含备份文件的子目录单独保留1个最新版本,使用以下命令:
find . -type f -name "backupname.tar.gz" -exec dirname {} \; | sort -u | while read dir; do find "$dir" -maxdepth 1 -type f -name "backupname.tar.gz" -printf "%T@ %p\0" | sort -z -k1,1nr | sed -z '1d' | cut -z -d ' ' -f2- | xargs -0 rm -f done
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

