如何查找并 tar 文件然后删除它们

如何查找并 tar 文件然后删除它们

我需要找到超过 30 天的文件,将其打包并压缩,然后删除那些已经打包并压缩的文件。

我试图执行这样的操作,但它看起来不起作用

find /u01/oracle/files -mtime +30 -exec tar -czvf filename_$(date +%Y-%m-%d).tar.gz /u01/oracle/files {} \;

答案1

该命令不起作用,因为它会为找到的每个文件find调用一个新tar实例,并且每个tar实例都会用一个新实例覆盖存档文件,该新实例仅包含由 提供的一个文件find。您想要的是find汇编所有文件的完整列表,然后将该列表传递给单个tar

find /u01/oracle/files -mtime +30 -print0 | tar -czvf filename_$(date +%Y-%m-%d).tar.gz --null -T /dev/stdin

如果您的版本tar支持,请添加--remove-files标志以删除已成功压缩的源文件。

如果你tar不支持此标志,你可以改用此脚本:

#!/bin/bash -e
filelist="$(mktemp)"
find /u01/oracle/files -mtime +30 -print0 > "$filelist"
tar -czvf "filename_$(date +%Y-%m-%d).tar.gz" --null -T "$filelist"
xargs -0 rm < "$filelist"
rm "$filelist"

使用临时文件来存储列表而不是重新生成它,可以避免出现文件可能被认为不够旧而无法执行命令的情况tar,但是在创建档案时,时间已经过去并且有更多文件匹配。

确保-e在 shebang(第一行)中包含。如果省略它,bash 将忽略其执行的命令的错误,从而可能导致数据丢失。

相关内容