Как копировать каждый день в другой из двух пунктов назначения?

Дайте Zim шанс!

Я не полностью знаю MS One Note, но, возможно, вы могли бы попробовать zim.

Zim - графический текстовый редактор, используемый для поддержки коллекции страниц вики. Каждая страница может содержать ссылки на другие страницы, простое форматирование и изображения. Страницы хранятся в структуре папок, как в outliner, и могут иметь вложения. Создание новой страницы так же просто, как привязка к несуществующей странице. Все данные хранятся в текстовых файлах с форматированием wiki. Различные плагины предоставляют дополнительные функции, такие как менеджер списка задач, редактор уравнений, значок в трее и поддержка контроля версий. На веб-странице Zim.

Мое использование

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

Поскольку он сохраняет информацию в TXT-файлах, я помещаю папку примечаний в свой OwnCloud. Поэтому я могу прочитать его, даже если у меня нет Zim, или я на другом ПК. Dropbox или другое облачное программное обеспечение, которое помещает папку синхронизации в вашу файловую систему.

Если у вас более одной машины, вы можете использовать одни и те же заметки во всех из них, выполнив вышеуказанное.

Положите руки на него

Похоже на это (немного лучше в Ubuntu с маленькими значками):

Для получения дополнительной информации , взгляните на скринкаст и скриншоты.

Вы найдете его в скринкаст и скриншоты , на странице загрузки или добавив PPA (из Launchpad):

sudo add-apt-repository ppa:jaap.karssenberg/zim  
sudo apt-get update  
sudo apt-get install zim

Редактировать:

Также интересна страница для загрузки в Github.

7
задан 1 December 2017 в 17:07

12 ответов

Один лайнер:

0 0 * * * cp /path/to/* /path/to/destination.$(( $(date -d $(date +%F) +%s)/(3600*24) % 2))

Объяснение:

$(( $(date -d 0:00 +%s)/(3600*24) % 2))
вернет метку времени в секундах (+%s) сегодня в 0:00 (-d 0:00). Разделенный на (3600*24) будет возвращать число дней из unix-эпохи. %2 вернет 0 или 1 для нечетных или даже дней с момента запуска unix-эпохи.
6
ответ дан 22 May 2018 в 15:45
  • 1
    % 2 - простая операция по модулю, которая возвращает 1, если число дней, присвоенное ей, является нечетным, а 0 - четным. – Videonauth 1 December 2017 в 17:49
  • 2
    +1 для решения с использованием опции seconds since 1970-01-01 00:00:00 UTC . На этом пути вам не нужно думать о проблеме 30/31 дней / месяцев других попыток здесь – derHugo 1 December 2017 в 18:20
  • 3
    @RoVo это именно то, что я искал из-за двух нечетных дней 31 и 1! Очень умно! – Stefan 2 December 2017 в 19:20
  • 4
    Вы также можете избавиться от вложенного вызова $(date +%F), описав полночь, например: date -d "12am today" +%s (или -d 00:00, если это сделает вас более комфортным). – drewbenn 2 December 2017 в 21:04
  • 5
    Правда. Я обновляю ответ. – RoVo 2 December 2017 в 21:18

Один лайнер:

0 0 * * * cp /path/to/* /path/to/destination.$(( $(date -d $(date +%F) +%s)/(3600*24) % 2))

Объяснение:

$(( $(date -d 0:00 +%s)/(3600*24) % 2)) вернет метку времени в секундах (+%s) сегодня в 0:00 (-d 0:00). Разделенный на (3600*24) будет возвращать число дней из unix-эпохи. %2 вернет 0 или 1 для нечетных или даже дней с момента запуска unix-эпохи.
6
ответ дан 18 July 2018 в 02:14

Один лайнер:

0 0 * * * cp /path/to/* /path/to/destination.$(( $(date -d $(date +%F) +%s)/(3600*24) % 2))

Объяснение:

$(( $(date -d 0:00 +%s)/(3600*24) % 2)) вернет метку времени в секундах (+%s) сегодня в 0:00 (-d 0:00). Разделенный на (3600*24) будет возвращать число дней из unix-эпохи. %2 вернет 0 или 1 для нечетных или даже дней с момента запуска unix-эпохи.
6
ответ дан 24 July 2018 в 17:30

Если было бы нормально писать на ~/destination.0 в четные даты и ~/destination.1 в нечетные даты, следующая строка crontab должна работать. Он начинает резервное копирование в полночь (0 мин, 0 час, два первых элемента на линии),

0 0 * * * echo cd dir2copy;dtmp=$(( $(/bin/date '+%d') % 2 ));echo /bin/cp * ~/destination."$dtmp"

См. Эту ссылку для объяснения синтаксиса crontab,

Планирование задач с заданиями Cron

Проверьте командную часть строки в окне терминала,

echo cd dir2copy;dtmp=$(( $(/bin/date '+%d') % 2 ));echo /bin/cp * ~/destination."$dtmp"

, и когда она будет работать, вы можете заменить cd dir2copy на cd to-the-actual-directory-you-want-to-copy, замените ~ на /home/your-home-directory и удалите два слова echo, чтобы сделать это реальным заданием.

Протестируйте его снова, а затем измените линию crontab. (Среда в crontab такова, что вам могут потребоваться явные полные пути к программам, каталогам и файлам данных.)

/bin/date '+%d' находит день месяца, а % - операция останова, которая создает 0 или 1, который добавляется в конце командной строки.

Вы можете предпочесть /bin/date '+%j', который находит день года, например сегодня , 1 декабря, является днем ​​#335.

3
ответ дан 22 May 2018 в 15:45
  • 1
    не будет чередоваться между днями 365 и 1. – RoVo 1 December 2017 в 18:17
  • 2
    Да, вы правы @RoVo. Я заметил, что вы исправили это, и я отвечу на ваш ответ :-) Вы потратили больше усилий, чем я, чтобы все работало точно в соответствии со спецификацией в вопросе. В новом году мне было бы хорошо, что чередование пропустит. Мой компьютер может быть выключен в любом случае ;-) – sudodus 1 December 2017 в 18:24
  • 3
    Правда, но я начал с той же проблемы ... +%w: ебать неделю имеет нечетное количество дней ... тогда +%d, затем +%j ... тогда ... дерьмо, я трахаюсь. .. – RoVo 1 December 2017 в 18:26
  • 4
    В любом случае после високосного года +%j будет работать правильно в новый год ^^ – RoVo 1 December 2017 в 18:29
  • 5
    если високосный год %100: P – derHugo 1 December 2017 в 18:31

Я согласен с ответами «запустите cronjob daily, switch directories in the script», но я бы сделал это следующим образом:

#!/bin/bash 
# use hidden link
last=$HOME/.last_destination
#
declare -a dirs
dirs[0]="destination.0"
dirs[1]="destination.1"
#
target=
#
# If $last is a link, it points to the last used directory. Otherwise,
# initialize it and use $HOME/destination.0
if [[ -L "$last" ]] ; then
    # get the name of the linked dir
    old="$(stat  --printf="%N" "$last" | cut -d\' -f4)"
    if [[ "$old" == "${dirs[0]}" ]] ; then
        target="${dirs[1]}"
    else
        target="${dirs[0]}"
    fi
else
    # "$last" is not a link - first time initialization
    target="${dirs[0]}"
fi
# now, with $target set, point the $last link at $target, for next time
rm "$last"
ln -s "$target" "$last"
#
# debugging printouts - remove in real life
echo "$target"
ls -l "$last"
2
ответ дан 22 May 2018 в 15:45

Запускайте этот скрипт ежедневно из cron:

#! /bin/sh set -e cp * ~/destination.0 mv ~/destination.0 ~/destination.last mv ~/destination.1 ~/destination.0 mv ~/destination.last ~/destination.0
0
ответ дан 22 May 2018 в 15:45
  • 1
    вы никогда ничего не пишите ~/destination.1 ... – derHugo 1 December 2017 в 17:55
  • 2
    Правильно, в моем (непроверенном) скрипте есть ошибка, последняя строка должна переименовывать * .last в * .1 вместо * .0 ... и тем временем я видел лучшие решения, включающие вычисления по модулю 2 – Luc Moreau 1 December 2017 в 18:23
  • 3
    Даже если бы вы каждый день копировали destination.1 и имели destination.0 в качестве резервной копии, но фактически не чередовали между двумя пунктами назначения. – derHugo 1 December 2017 в 18:29

Запускайте этот скрипт ежедневно из cron:

#! /bin/sh set -e cp * ~/destination.0 mv ~/destination.0 ~/destination.last mv ~/destination.1 ~/destination.0 mv ~/destination.last ~/destination.0
0
ответ дан 18 July 2018 в 02:14

Если было бы нормально писать на ~/destination.0 в четные даты и ~/destination.1 в нечетные даты, следующая строка crontab должна работать. Он начинает резервное копирование в полночь (0 мин, 0 час, два первых элемента на линии),

0 0 * * * echo cd dir2copy;dtmp=$(( $(/bin/date '+%d') % 2 ));echo /bin/cp * ~/destination."$dtmp"

См. Эту ссылку для объяснения синтаксиса crontab,

Планирование задач с заданиями Cron

Проверьте командную часть строки в окне терминала,

echo cd dir2copy;dtmp=$(( $(/bin/date '+%d') % 2 ));echo /bin/cp * ~/destination."$dtmp"

, и когда она будет работать, вы можете заменить cd dir2copy на cd to-the-actual-directory-you-want-to-copy, замените ~ на /home/your-home-directory и удалите два слова echo, чтобы сделать это реальным заданием.

Протестируйте его снова, а затем измените линию crontab. (Среда в crontab такова, что вам могут потребоваться явные полные пути к программам, каталогам и файлам данных.)

/bin/date '+%d' находит день месяца, а % - операция останова, которая создает 0 или 1, который добавляется в конце командной строки.

Вы можете предпочесть /bin/date '+%j', который находит день года, например сегодня , 1 декабря, является днем ​​#335.

3
ответ дан 18 July 2018 в 02:14

Я согласен с ответами «запустите cronjob daily, switch directories in the script», но я бы сделал это следующим образом:

#!/bin/bash # use hidden link last=$HOME/.last_destination # declare -a dirs dirs[0]="destination.0" dirs[1]="destination.1" # target= # # If $last is a link, it points to the last used directory. Otherwise, # initialize it and use $HOME/destination.0 if [[ -L "$last" ]] ; then # get the name of the linked dir old="$(stat --printf="%N" "$last" | cut -d\' -f4)" if [[ "$old" == "${dirs[0]}" ]] ; then target="${dirs[1]}" else target="${dirs[0]}" fi else # "$last" is not a link - first time initialization target="${dirs[0]}" fi # now, with $target set, point the $last link at $target, for next time rm "$last" ln -s "$target" "$last" # # debugging printouts - remove in real life echo "$target" ls -l "$last"
2
ответ дан 18 July 2018 в 02:14

Запускайте этот скрипт ежедневно из cron:

#! /bin/sh set -e cp * ~/destination.0 mv ~/destination.0 ~/destination.last mv ~/destination.1 ~/destination.0 mv ~/destination.last ~/destination.0
0
ответ дан 24 July 2018 в 17:30
  • 1
    вы никогда ничего не пишите ~/destination.1 ... – derHugo 1 December 2017 в 17:55
  • 2
    Правильно, в моем (непроверенном) скрипте есть ошибка, последняя строка должна переименовывать * .last в * .1 вместо * .0 ... и тем временем я видел лучшие решения, включающие вычисления по модулю 2 – Luc Moreau 1 December 2017 в 18:23
  • 3
    Даже если бы вы каждый день копировали destination.1 и имели destination.0 в качестве резервной копии, но фактически не чередовали между двумя пунктами назначения. – derHugo 1 December 2017 в 18:29

Если было бы нормально писать на ~/destination.0 в четные даты и ~/destination.1 в нечетные даты, следующая строка crontab должна работать. Он начинает резервное копирование в полночь (0 мин, 0 час, два первых элемента на линии),

0 0 * * * echo cd dir2copy;dtmp=$(( $(/bin/date '+%d') % 2 ));echo /bin/cp * ~/destination."$dtmp"

См. Эту ссылку для объяснения синтаксиса crontab,

Планирование задач с заданиями Cron

Проверьте командную часть строки в окне терминала,

echo cd dir2copy;dtmp=$(( $(/bin/date '+%d') % 2 ));echo /bin/cp * ~/destination."$dtmp"

, и когда она будет работать, вы можете заменить cd dir2copy на cd to-the-actual-directory-you-want-to-copy, замените ~ на /home/your-home-directory и удалите два слова echo, чтобы сделать это реальным заданием.

Протестируйте его снова, а затем измените линию crontab. (Среда в crontab такова, что вам могут потребоваться явные полные пути к программам, каталогам и файлам данных.)

/bin/date '+%d' находит день месяца, а % - операция останова, которая создает 0 или 1, который добавляется в конце командной строки.

Вы можете предпочесть /bin/date '+%j', который находит день года, например сегодня , 1 декабря, является днем ​​#335.

3
ответ дан 24 July 2018 в 17:30
  • 1
    не будет чередоваться между днями 365 и 1. – RoVo 1 December 2017 в 18:17
  • 2
    Да, вы правы @RoVo. Я заметил, что вы исправили это, и я отвечу на ваш ответ :-) Вы потратили больше усилий, чем я, чтобы все работало точно в соответствии со спецификацией в вопросе. В новом году мне было бы хорошо, что чередование пропустит. Мой компьютер может быть выключен в любом случае ;-) – sudodus 1 December 2017 в 18:24
  • 3
    Правда, но я начал с той же проблемы ... +%w: ебать неделю имеет нечетное количество дней ... тогда +%d, затем +%j ... тогда ... дерьмо, я трахаюсь. .. – RoVo 1 December 2017 в 18:26
  • 4
    В любом случае после високосного года +%j будет работать правильно в новый год ^^ – RoVo 1 December 2017 в 18:29
  • 5
    если високосный год %100: P – derHugo 1 December 2017 в 18:31

Я согласен с ответами «запустите cronjob daily, switch directories in the script», но я бы сделал это следующим образом:

#!/bin/bash # use hidden link last=$HOME/.last_destination # declare -a dirs dirs[0]="destination.0" dirs[1]="destination.1" # target= # # If $last is a link, it points to the last used directory. Otherwise, # initialize it and use $HOME/destination.0 if [[ -L "$last" ]] ; then # get the name of the linked dir old="$(stat --printf="%N" "$last" | cut -d\' -f4)" if [[ "$old" == "${dirs[0]}" ]] ; then target="${dirs[1]}" else target="${dirs[0]}" fi else # "$last" is not a link - first time initialization target="${dirs[0]}" fi # now, with $target set, point the $last link at $target, for next time rm "$last" ln -s "$target" "$last" # # debugging printouts - remove in real life echo "$target" ls -l "$last"
2
ответ дан 24 July 2018 в 17:30

Другие вопросы по тегам:

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