只查找和执行文件名


1

我需要查找超过X天的所有文件,并在本地和我的s3存储桶中删除它们。问题是find命令也返回完整路径和文件名。我试过搞乱basename和其他一些东西,但是无法让它工作。任何帮助将不胜感激。

现在,当我在玩它时,'删除它们本地'部分是ls而不是rm。对于rm我需要完整的路径。

我需要从s3cmd调用中删除/ home / ec2-user / backups /

$ 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
怎么了rm full-path-and-filename
David Dai

正如我所提到的,我需要rm的完整路径...... s3cmd部分不能使用完整路径。
KisnardOnline 2016年

Answers:


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

我需要执行的命令不是rm ...它是s3cmd del s3:// kisnardonline / {}。rm部分工作正常。
KisnardOnline

@KisnardOnline它现在已经修复,加上另外一个选项
Ziggy Crueltyfree Zeitgeister 2016年

1
第二部分工作..非常感谢你!find / home / ec2-user / backups -type f -mtime +3 | 同时读取文件; 做s3cmd del s3:// kisnardonline / $ {file#* ups /}; 完成
KisnardOnline

0

试试这个简单的修改:

cd /home/ec2-user/backups/; find -type f -mtime +3 -exec ls {} \; -exec s3cmd del s3://kisnardonline/{} \;

这样,返回的每个路径find都相对于/home/ec2-user/backups/并以其开头./。如果s3cmd和/或s3服务器足够智能以解释./它应该的方式(即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


我编辑了我的答案以满足s3cmd,这与./无效。
Kamil Maciorowski
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.