Мне нужно найти все файлы старше 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
что не так с `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