我需要找到超过 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 将忽略其执行的命令的错误,从而可能导致数据丢失。