Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Скрипт для работы с данными  (Прочитано 4058 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Симэн

  • Автор темы
  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
Скрипт для работы с данными
« : 23 Октября 2015, 15:56:46 »
Добрый день.

Необходимо упорядочить файлы, которые поступают благодаря работающей програме motion.

В скриптах не силен: http://www.opennet.ru/docs/RUS/bash_scripting_guide/

Скрипты запускает cron.

Но на основании того что знаю, смог организовать следующее:

- motion пишет файлы в оперативную папку (условно Х)
- каждый час, motion останавливается
- папка Х переименовывается в
22-10-15_15:**:**
$(date +%d-%m-%y_%T)
- создается новая папка Х
- запускается motion
===
- раз в сутки (ночью) создается папка (с содержимым дня)
22-10-15
$(date +%d-%m-%y)

Не удалось:  :-\

- туда необходимо переместить все папки вида:
22-10-15_15:**:**, 22-10-15_16:**:**, 22-10-15_17:**:**

===

Объем диска ограничен, поэтому условно все записи созданные 35 дней назад нужно удалять.

Прописать в cron вроде:

17 3 * * * find /mnt/ya -type d -mtime +35 -exec rm -R {} \;
не получится, потому что версия sh не поддерживает -mtime +35

===

Буду признателен за высказанные мысли, приведенные примеры и Ваши советы, по грамотной организации и опимизации данного процесса.
"Проект" не коммерческий, делается - что называется "для дома и семьи".
Заранее спасибо  ;)

Оффлайн fisher74

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 13758
    • Просмотр профиля
Re: Скрипт для работы с данными
« Ответ #1 : 23 Октября 2015, 16:10:42 »
Объем диска ограничен, поэтому условно все записи созданные 35 дней назад нужно удалять.
...
не получится, потому что версия sh не поддерживает -mtime +35
Намёк
date +%d-%m-%y --date="35 days ago"or
date +%d-%m-%y --date="-35 days"
В качестве рекомендации смените порядок параметров даты на , тогда будете видеть нормальную упорядоченность директорий, когда после 1-ого января будет 2 января, а не 1 февраля.
Или американский стиль +%m-%d-%y, но так сами будете путаться.

« Последнее редактирование: 23 Октября 2015, 16:23:03 от fisher74 »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Скрипт для работы с данными
« Ответ #2 : 23 Октября 2015, 16:24:07 »
Формат %d-%m-%y не позволит нормально сортировать папки. Используйте стандартные %Y-%m-%d
mv $(date -d yesterday +%F)_* $(date -d yesterday +%F)/#!/bin/sh
cd /mnt/ya
for dir in 201*/
do
    [ $(date +%s -d '-35 day') -gt $(date +%s -d ${dir%_*}) ] && echo rm -R "$dir"
done
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн fisher74

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 13758
    • Просмотр профиля
Re: Скрипт для работы с данными
« Ответ #3 : 23 Октября 2015, 16:35:32 »
Продолжаю генерить идеи
- motion пишет файлы в оперативную папку (условно Х)
- каждый час, motion останавливается
- папка Х переименовывается в
22-10-15_15:**:**
$(date +%d-%m-%y_%T)
- создается новая папка Х
- запускается motion
Плохо...

- motion пишет файлы в оперативную папку ссылку (условно now) на директорию (условно Х) текущего часа
- каждый час, создаётся папка для нового часа
mkdir -p $(date +%y-%m-%d_%H)(кстати, ещё одна фишечка)
- motion останавливается
- ссылка now перелинковывается на директорию нового часа
- запускается motion


Оффлайн Симэн

  • Автор темы
  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
Re: Скрипт для работы с данными
« Ответ #4 : 23 Октября 2015, 17:14:30 »
fisher74 и Azure
Огромное спасибо  :)
Пошел переваривать ваш могучий поток сознания  :P
===
Зы, конечно лучше motion не останавливать....
« Последнее редактирование: 23 Октября 2015, 17:16:58 от Симэн »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Скрипт для работы с данными
« Ответ #5 : 23 Октября 2015, 18:18:51 »
А как в motion назначается папка записи?
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн fisher74

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 13758
    • Просмотр профиля
Re: Скрипт для работы с данными
« Ответ #6 : 23 Октября 2015, 18:20:53 »
Попробуйте другой подход.
Пишите в одну директорию. А из неё уже регулярно перебрасывайте файлы в нужные директории. Проблему открытого файла можно решить проверкой признака EOF.
Правда я точно не знаю как это проверять в bash и на сколько это вообще правильно.

Оффлайн Симэн

  • Автор темы
  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
Re: Скрипт для работы с данными
« Ответ #7 : 23 Октября 2015, 19:02:01 »
Azure,

Стандартно  :)

target_dir /mnt/ya/X
Там такой важный момент, запись идет на Яндекс диск, который монтируется с помощью davfs2.

Кстати делал аварийный скрипт после перезагрузки устройства или отмонтирования Яндекс диска, не удается остановить исполнение yes

ввожу в терминал:

yes | mount.davfs https://webdav.yandex.ru /mnt/ya
работает, тоже в скрипте

yes | mount.davfs https://webdav.yandex.ru /mnt/ya
yes висит в top-e

===

fisher74

Обязательно попробую, "впитываю как губка", спасибо  :)

P.S. Сумашедшая у вас защита от спама  :2funny:

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Скрипт для работы с данными
« Ответ #8 : 23 Октября 2015, 19:54:47 »
fisher74, Если там файлы, а не 1 видео.
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Симэн

  • Автор темы
  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
Re: Скрипт для работы с данными
« Ответ #9 : 23 Октября 2015, 20:08:25 »
fisher74, Если там файлы, а не 1 видео.
Пока скриншотит движение.
Скорее всего, этим и ограничиться.
В принципе, с точки зрения нашей криминалистики - качественные фото пожалуй даже лучше чем видео, не всегда соответствующего качества.

Оффлайн fisher74

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 13758
    • Просмотр профиля
Re: Скрипт для работы с данными
« Ответ #10 : 23 Октября 2015, 20:37:36 »
Если там файлы, а не 1 видео.
Епстепственно, но кто мешает выставить параметр max_mpeg_time (а для режима motion - парметр gap)?

Оффлайн Симэн

  • Автор темы
  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
Re: Скрипт для работы с данными
« Ответ #11 : 24 Октября 2015, 10:44:15 »
Shell здесь оригинальный и на аргументы навроде yesterday, today и "35 days ago" он ругается, это:

BusyBox v1.23.2 (2015-10-21 23:46:35 MSK) built-in shell (ash)

Сделал автоматическое перемещение каждой папки часа, в папку дня - сразу после переименования папки Х в папку часа и создания новой папки Х.
Выпонение скрипта настраивается за 1-2 минуты до окончания часа.
Так как в качестве носителя используется Яндекс Диск, после оперций переименования и перемещения необходимо использовать sleep иначе операция с объемными файлами не будет выполнена.

Как сказал Azure применение стандартного строго - %Y-%m-%d помогло, заработало перемещение и переменование:
mv $(date +%Y-%m-%d_%H)/ $(date +%Y-%m-%d)

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Скрипт для работы с данными
« Ответ #12 : 24 Октября 2015, 11:33:10 »
на аргументы навроде yesterday, today и "35 days ago" он ругается
Не должен вообще-то. Это параметры самой date, а не шелла. Надо смотретьdate --helpЭта команда работает?dir=$(date +%Y-%m-%d_%H)
date +%s -d ${dir%_*}
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Симэн

  • Автор темы
  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
Re: Скрипт для работы с данными
« Ответ #13 : 24 Октября 2015, 11:42:52 »
Azure,
**@**:~# date --help
BusyBox v1.23.2 (2015-10-21 23:46:35 MSK) multi-call binary.

Usage: date [OPTIONS] [+FMT] [TIME]

Display time (using +FMT), or set time

[-s,--set] TIME Set time to TIME
-u,--utc Work in UTC (don't convert to local time)
-R,--rfc-2822 Output RFC-2822 compliant date string
-I[SPEC] Output ISO-8601 compliant date string
SPEC='date' (default) for date only,
'hours', 'minutes', or 'seconds' for date and
time to the indicated precision
-r,--reference FILE Display last modification time of FILE
-d,--date TIME Display TIME, not 'now'
-D FMT Use FMT for -d TIME conversion
-k Set Kernel timezone from localtime and exit

Recognized TIME formats:
hh:mm[:ss]
[YYYY.]MM.DD-hh:mm[:ss]
YYYY-MM-DD hh:mm[:ss]
[[[[[YY]YY]MM]DD]hh]mm[.ss]
Вроде да:
dir=$(date +%Y-%m-%d_%H) && date +%s -d ${dir%_*}вывод: вида 1445634000
« Последнее редактирование: 24 Октября 2015, 11:47:25 от Симэн »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Скрипт для работы с данными
« Ответ #14 : 24 Октября 2015, 11:58:58 »
Ну и чудненько. 35 дней — это 3024000 секунд, т.е мы всегда математически можем найти дату 35 дней назад:    [ $(($(date +%s) - 3024000)) -gt $(date +%s -d ${dir%_*}) ] …Еще стоит глянуть на find --help
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

Страница сгенерирована за 0.097 секунд. Запросов: 25.