仅查找并执行文件名

仅查找并执行文件名

我需要查找所有超过 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/./bars3://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

相关内容