我需要查找所有超过 X 天的文件,并在本地和我的 s3 存储桶中删除它们。问题是 find 命令也返回了完整路径和文件名。我尝试弄乱 basename 和其他一些东西,但无法让它工作。任何帮助都将不胜感激。
目前,“本地删除”部分是 ls,而不是 rm,而我正在尝试使用 rm。对于 rm,我需要完整路径。
我需要脱衣服/home/ec2-用户/备份/在 s3cmd 调用之外。
$ find /home/ec2-user/backups -type f -mtime +3 -exec ls {} \; -exec s3cmd del s3://kisnardonline/{} \;
/home/ec2-user/backups/FILESYSTEM-2016-04-09_00-00.tar.gz
File s3://kisnardonline//home/ec2-user/backups/FILESYSTEM-2016-04-09_00-00.tar.gz deleted
答案1
有多种方法可以实现这一点。find -print0
和的组合xargs -0
功能强大且安全sed -z
(使用 NULL 作为行分隔符):
find /home/ec2-user/backups -type f -mtime +3 -print0 |\
sed -z 's/^.*\?backups/s3:\//' |\
xargs -0 -n 1 s3cmd del
由于s3cmd
尚不支持删除多个文件,xargs
因此需要-n 1
将执行限制为一次一行。
另一种方法,也许更简单,是find
通过管道read
并使用 bash 变量替换:
find /home/ec2-user/backups -type f -mtime +3 |\
while read file; do s3cmd del ${file#*ups/}; done
答案2
尝试这个简单的修改:
cd /home/ec2-user/backups/; find -type f -mtime +3 -exec ls {} \; -exec s3cmd del s3://kisnardonline/{} \;
这样,返回的每个路径find
都相对于/home/ec2-user/backups/
并以 开头。如果和/或 s3 服务器足够智能,能够以应有的方式进行解释(即等于等) ./
,它将起作用。s3cmd
./
s3://foo/./bar
s3://foo/bar
s3cmd 不能与 ./ 一起使用
在这种情况下:
cd /home/ec2-user/backups/; find -type f -mtime +3 | while read F ; do ls "$F"; F="`echo $F | cut -c 3-`"; s3cmd del "s3://kisnardonline/$F"; done