LINUX.ORG.RU

Использование утилиты dropbox-uploader для удаления файлов на дропбокс-аккунте

 ,


0

2

Добрый день,

Хотелось бы задать вопрос по ключам (флагам) утилиты.

Есть утилита «dropbox-uploader», с помощью которой на удаленный аккунт в дропбоксе загружаются бэкапы mysql. У этой утилиты есть опция -list с помощью которой она выводит список файлов в указанной удаленной папке в dropbox'е, например:

$ ./dropbox-uploader list /backups/sqlbackups/

она выдает список файлов в удаленной директории дропбокса, например:

[F] 108579  0705151800_mysql_backup.gz
[F] 108589  0805150000_mysql_backup.gz
[F] 108591  0805150600_mysql_backup.gz

Еще у этой утилиты есть опция -delete с помощью которой можно с указанием пути и маски удалить файл или группу файлов.

Скажите, можно ли используя возможности этой утилиты и команду find с флагами -mtime удалять на аккунте dropbox файлы старше, например, 2 дней. И если да, как должна выглядеть команда в bash?

Например для удаления файлов старше двух дней на локальной машине я ввожу:

$ find *mysql_backup.gz -mtime -2 -exec rm {} \;

Как сделать тоже самое с утилитой dropbox-uploader? Я так понимаю это должна быть команда-гибрид утилит «find» и «dropbox-uploader»

Спасибо заранее за ответы.



Последнее исправление: Vert (всего исправлений: 2)

Вообще этот скрипт (хотя не плохо было бы дать линк на то чем ты пользуешься, так что пишу про свой) получает информацию о времени создания файла, просто не выводит ее на экран (можешь запустить с ключом -d и убедиться), так что можешь поправить сам скрипт чтоб он дату создания файла тебе тоже показывал, а потом полученные данные удобным способом парсить. Ищи примерно на 954 строке начало этого блока (думаю что скрипт у нас таки одинаковый).

alozovskoy ★★★★★
()
Последнее исправление: alozovskoy (всего исправлений: 1)
Ответ на: комментарий от alozovskoy

Да, действительно у нас один и тот же скрипт и строка 954 похоже выдает информацию о файле. Только проблема в том что я ничего в этом не понимаю, в программировании. У меня сайт установлен на хостинге и я ищу возможности его удаленно бэкапить.

Так возвращаясь к началу, а в помощью утилиты find можно что-то сделать? «Перенаправлять» её в удаленную папку дропбокса. Не знаю, как лучше объяснить.

Vert
() автор топика
Ответ на: комментарий от Vert

парсить, вмысле для того чтобы потом их обрабатывать, то есть писать под это отдельную программу/скрипт?

Ну не совсем полноценный скрипт потребуется, просто будет возможность найти файлы «старше» какого-то времени, однострочником можно сделать.

Кстати говоря, раз ты можешь удалять по маске, не проще ли делать так: delete 0705*.gz для файлов из твоего поста

alozovskoy ★★★★★
()
Ответ на: комментарий от Vert

а в помощью утилиты find можно что-то сделать?

Нет - она работает локально, не в облаке. Может и можно dropbox подключить локально и использовать find, но тут ничего сказать не могу, не пробовал.

alozovskoy ★★★★★
()
Ответ на: комментарий от alozovskoy

!!!!! ДЕЙСТВИТЕЛЬНО !!!!! СПАСИБО :)

СЕЙЧАС ПОПРОБУЮ

Vert
() автор топика
Ответ на: комментарий от alozovskoy

Нет, рано я обрадовался.

Ведь нужно удалять файлы исходя из их давности, а маска «давности» постоянно меняется

Единственный вариант реализации который приходит в голову, это перед каждым бэкапом сначала стирать все старые копии на локальной сервере, затем стирать все файлы у удаленной папке дропбокса и закачивать все заново. Впринципе, рабочий вариант, но слишком много трафика будет отжирать и лишняя нагрузка..

Vert
() автор топика
Ответ на: комментарий от Vert

не стирать все копии на локальном сервере, а произвести все операции с удалением старых копий на локальном сервере, затем удалить все на дропбоксе и закачать все с нуля

Получается эдакая кривоватая синхронизация.

Vert
() автор топика
Ответ на: комментарий от Vert

Я бы делал цикл по всем файлам, для каждого проверял бы дату (на баше элементарно делается), и если файл слишком старый - удалял бы его.

То есть делаешь один list с показом даты, а потом много отдельных delete.

tiandrey ★★★★★
()
Последнее исправление: tiandrey (всего исправлений: 1)
Ответ на: комментарий от Vert

Смотри, сейчас у тебя каша - много файлов за большой промежуток времени, например в день у тебя делается четыре бэкапа, и имя файла у них будет вида 0805201501.gz (ну как пример, не важно, в общем в имени присутствует дата создания бэкапа). Сейчас ты руками вычищаешь то, что не нужно. Дальше - скажем, тебе нужно хранить бэкапы за два последних дня и текущий, то есть сейчас у тебя должны быть файлы за 6, 7 и 8 числа мая, и плюс лежат файлы за 5 число, которые нужно удалить. Делаешь так:

./dropbox-uploader delete $(date --date=-'3 day' '+%d%m%Y*.gz')

Таким образом ты удалил фалы за 5 число. После полуночи опять запускаешь эту команду - удаляешь файлы за 6 число. И так далее.

alozovskoy ★★★★★
()
Ответ на: комментарий от Vert

Ну и по скольку я не знаю, на сколько хорошо ты знаком с GNU\Linux, советую для всех этих действий посмотреть на планировщик cron (чтоб не запускать команды руками), информации и примеров в сети очень много, да и мануал там простой и понятный.

alozovskoy ★★★★★
()
Ответ на: комментарий от alozovskoy

Рано я обрадовался. Не умеет программа работать с файлами по маске, хотя мне почему-то казалось что вроде умеет.

user@bane:~/backups/site[1] $ ./dropbox_uploader.sh -d delete $(date --date=-'2 day' '+%d%m%Y*.gz')
0.14
+ RESPONSE_FILE=/tmp/du_resp_debug
+ [[ '' == '' ]]
+ BIN_DEPS='sed basename date grep stat dd mkdir curl'
+ CURL_BIN=curl
+ which sed basename date grep stat dd mkdir curl
+ [[ 0 != 0 ]]
+ which readlink
+ [[ 0 == 0 ]]
++ readlink -m //test
+ [[ /test == \/\t\e\s\t ]]
+ HAVE_READLINK=1
+ builtin printf ''
+ [[ 0 == 0 ]]
+ PRINTF='builtin printf'
+ PRINTF_OPT='-v o'
+ [[ -e /home/ ]]
+ source /home/
+ [[ * == '' ]]
+ [[ * == '' ]]
+ [[ * == '' ]]
+ [[ * == '' ]]
+ [[ sandbox == '' ]]
+ COMMAND=delete
+ ARG1='06052015*.gz'
+ ARG2=
+ let argnum=3-2
+ case $COMMAND in
+ [[ 1 -lt 1 ]]
+ FILE_DST='06052015*.gz'
+ db_delete '/06052015*.gz'
++ normalize_path '/06052015*.gz'
+++ echo -e '/06052015*.gz'
++ path='/06052015*.gz'
++ [[ 1 == 1 ]]
+++ readlink -m '/06052015*.gz'
++ new_path='/06052015*.gz'
++ [[ z == \/ ]]
++ echo '/06052015*.gz'
+ local 'FILE_DST=/06052015*.gz'
+ print ' > Deleting "/06052015*.gz"... '
+ [[ 0 == 0 ]]
+ echo -ne ' > Deleting "/06052015*.gz"... '
 > Deleting "/06052015*.gz"... ++ utime
+++ date +%s
++ echo 1431085849
++ urlencode '/06052015*.gz'
++ local 'string=/06052015*.gz'
++ local strlen=13
++ local encoded=
++ (( pos=0  ))
++ (( pos<strlen  ))
++ c=/
++ case "$c" in
++ builtin printf -v o %%%02x ''\''/'
++ encoded+=%2f
++ (( pos++  ))
++ (( pos<strlen  ))
++ c=0
++ case "$c" in
++ o=0
++ encoded+=0
++ (( pos++  ))
++ (( pos<strlen  ))
++ c=6
++ case "$c" in
++ o=6
++ encoded+=6
++ (( pos++  ))
++ (( pos<strlen  ))
++ c=0
++ case "$c" in
++ o=0
++ encoded+=0
++ (( pos++  ))
++ (( pos<strlen  ))
++ c=5
++ case "$c" in
++ o=5
++ encoded+=5
++ (( pos++  ))
++ (( pos<strlen  ))
++ c=2
++ case "$c" in
++ o=2
++ encoded+=2
++ (( pos++  ))
++ (( pos<strlen  ))
++ c=0
++ case "$c" in
++ o=0
++ encoded+=0
++ (( pos++  ))
++ (( pos<strlen  ))
++ c=1
++ case "$c" in
++ o=1
++ encoded+=1
++ (( pos++  ))
++ (( pos<strlen  ))
++ c=5
++ case "$c" in
++ o=5
++ encoded+=5
++ (( pos++  ))
++ (( pos<strlen  ))
++ c='*'
++ case "$c" in
++ builtin printf -v o %%%02x ''\''*'
++ encoded+=%2a
++ (( pos++  ))
++ (( pos<strlen  ))
++ c=.
++ case "$c" in
++ o=.
++ encoded+=.
++ (( pos++  ))
++ (( pos<strlen  ))
++ c=g
++ case "$c" in
++ o=g
++ encoded+=g
++ (( pos++  ))
++ (( pos<strlen  ))
++ c=z
++ case "$c" in
++ o=z
++ encoded+=z
++ (( pos++  ))
++ (( pos<strlen  ))
++ echo %2f06052015%2a.gz
+ curl -s --show-error --globoff -i -o /tmp/du_resp_debug --data 'oauth_consumer_key=*&oauth_token=*&oauth_signature_method=PLAINTEXT&oauth_signature=*&oauth_timestamp=1431085849&oauth_nonce=15694&root=sandbox&path=%2f06052015%2a.gz' https://api.dropbox.com/1/fileops/delete
+ check_http_response
+ CODE=0
+ case $CODE in
+ grep -q 'HTTP/1.1 400' /tmp/du_resp_debug
+ grep -q '^HTTP/1.1 200 OK' /tmp/du_resp_debug
+ print 'FAILED\n'
+ [[ 0 == 0 ]]
+ echo -ne 'FAILED\n'
FAILED
+ ERROR_STATUS=1
+ remove_temp_files
+ [[ 1 == 0 ]]
+ exit 1
Vert
() автор топика
Ответ на: комментарий от alozovskoy

Немного знаком, лет 10 назад увлекался Linux-ом, идея свободного ПО меня захватила. Сидел ночами ядра компилировал, больше for fun. Да, с Cron-ом я буквально на днях разобрался, написал небольшой bash скрипт, который автоматически создает резервные копии MySQL и самого сайта, нашел скрипт, который загружает эти бэкапы на дропбокс.

Vert
() автор топика
Ответ на: комментарий от Vert

Ну ОК, тогда можно что-то вроде этого (не проверял)

for item in "$(./dropbox_uploader list | grep $(date --date=-'3 day' '+%d%m%Y*.gz') | awk '{print $3}')"
  do
    ./dropbox_uploader delete "$item"
done
alozovskoy ★★★★★
()
Последнее исправление: alozovskoy (всего исправлений: 2)
Ответ на: комментарий от Vert

Да, ссори, лишние кавычки. Вот так надо

for item in $(./dropbox_uploader list | grep $(date --date=-'3 day' '+%d%m%Y*.gz') | awk '{print $3}')
  do
    ./dropbox_uploader delete "$item"
done

Если опять будут проблемы, то проверь, выводятся ли имена файлов при запуске вот этого участка

./dropbox_uploader list | grep $(date --date=-'3 day' '+%d%m%Y*.gz') | awk '{print $3}'
alozovskoy ★★★★★
()
Ответ на: комментарий от alozovskoy

Круто! Работает! :)

Только есть один странный нюанс.

Команда:

./dropbox_uploader list | grep $(date --date=-'3 day' '+%d%m%Y*.gz') | awk '{print $3}'

Почему-то срабатывает только если в соответствующем пути есть только один файл, попадающий под критерий «старше трех дней» и, кстати, затем он исправно удаляется из дропбокса :) А если таких файлов старше трех дней уже несколько (больше двух), то она уже ничего не находит.

То есть, теоретически, если бы она находила всегда по одному файлу, можно было бы прописать в скрипте повторение команды на поиск и удаление N раз (в зависимости об кол-ва бэкапов в сутки), но поскольку она ничего не находит, непонятно как действовать..

Vert
() автор топика
Ответ на: комментарий от Vert

А покажи пример - какие файлы за нужный день отображает ./dropbox_uploader list. То есть выполни команду и кинь именно тот кусок результата, где есть файлы за какой-то день, который нужно удалить (где их больше одного). У меня с кол-вом файлов больше одного нормально работает.

alozovskoy ★★★★★
()
Ответ на: комментарий от alozovskoy

содержимое 1list.sh:

./dropbox_uploader list | grep $(date --date=-'1 day' '+%d%m%Y*.gz') | awk '{print $3}'

содержимое 1upload.sh:

for item in $(./dropbox_uploader list | grep $(date --date=-'1 day' '+%d%m%Y*.gz') | awk '{print $3}')
  do
    ./dropbox_uploader delete "$item"
done

А вот какие результаты получаются:

user@bane:~/backups/mysite.ru/files [0] $ ./1list
07052015x.gz
user@bane:~/backups/mysite.ru/files [0] $ ./dropbox_uploader list
 > Listing "//"... DONE
 [D] 0       mysite.ru
 [F] 8618795 07052015x.gz
 [F] 8578114 07052015y.gz
 [F] 104481  07052015z.gz
user@bane:~/backups/mysite.ru/files [0] $ ./1list.sh
07052015x.gz
user@bane:~/backups/mysite.ru/files [0] $ ./1upload.sh
 > Deleting "/07052015x.gz"... DONE
user@bane:~/backups/mysite.ru/files [0] $ ./dropbox_uploader list
 > Listing "//"... DONE
 [D] 0       mysite.ru
 [F] 8578114 07052015y.gz
 [F] 104481  07052015z.gz
user@bane:~/backups/mysite.ru/files [0] $ ./1list.sh
user@bane:~/backups/mysite.ru/files [0] $ ./1upload.sh
user@bane:~/backups/mysite.ru/files [0] $ ./dropbox_uploader list
 > Listing "//"... DONE
 [D] 0       mysite.ru
 [F] 8578114 07052015y.gz
 [F] 104481  07052015z.gz
user@bane:~/backups/mysite.ru/files [0] $ 

Vert
() автор топика
Ответ на: комментарий от alozovskoy

То есть в последнем примере вообще как-то странно - программа изначально из трех попадающих под критерий файлов находит только один.

Vert
() автор топика
Ответ на: комментарий от alozovskoy

ОК! Заранее большое спасибо!

Vert
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.