найти и выполнить только по имени файла

820
KisnardOnline

Мне нужно найти все файлы старше X дней и удалить их локально и из моей корзины s3. Проблема в том, что команда find возвращает мне полный путь и имя файла. Я попытался возиться с базовым именем и некоторыми другими вещами, но не смог заставить его работать. Любая помощь будет принята с благодарностью.

На данный момент часть «удалить их локально» - это ls вместо rm, пока я с ней играл. Для рм мне нужен полный путь.

Мне нужно удалить / home / ec2-user / backups / из вызовов 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
что не так с `rm full-path-and-filename`? David Dai 8 лет назад 1
Как я уже говорил, мне нужен полный путь к rm ... это часть s3cmd, которая не работает с полным путем. KisnardOnline 8 лет назад 0

2 ответа на вопрос

1
Ziggy Crueltyfree Zeitgeister

There are multiple ways this can be done. The combination of find -print0 and xargs -0 is powerful and safe to work in combination with sed -z (using NULL as line delimiter):

find /home/ec2-user/backups -type f -mtime +3 -print0 |\ sed -z 's/^.*\?backups/s3:\//' |\ xargs -0 -n 1 s3cmd del 

Since s3cmd does not (yet) support deleting multiple files, xargs requires -n 1 to limit execution to one line at a time.

Another way, perhaps simpler, is to pipe find through read and use bash variable substitution:

find /home/ec2-user/backups -type f -mtime +3 |\ while read file; do s3cmd del $; done 
команда, которую мне нужно выполнить, не rm ... это s3cmd del s3: // kisnardonline / {}. Rm часть работает нормально. KisnardOnline 8 лет назад 0
@KisnardOnline теперь исправлено, добавлена ​​еще одна опция Ziggy Crueltyfree Zeitgeister 8 лет назад 0
вторая часть сработала .. большое спасибо !! find / home / ec2-user / backups -type f -mtime +3 | во время чтения файла; do s3cmd del s3: // kisnardonline / $ ; сделанный KisnardOnline 8 лет назад 1
0
Kamil Maciorowski

Try this simple modification:

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

This way every path returned by find is relative to /home/ec2-user/backups/ and starts with ./. It will work if s3cmd and/or s3 server is smart enough to interpret ./ the way it should (i.e. s3://foo/./bar equals to s3://foo/bar etc.).

s3cmd does not work with ./

In that case:

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 не работает с ./ KisnardOnline 8 лет назад 0
Я отредактировал свой ответ, чтобы удовлетворить s3cmd, который не работает с ./. Kamil Maciorowski 8 лет назад 0

Похожие вопросы