Измените динамический каталог обоев каждый сезон

Я хочу иметь свои обои быть сезонным (лето, осень, зима, пружина), но также и обновление ежедневно с сезонными тематическими обоями.

Таким образом, по существу я думаю о наличии 4 каталогов (summer, fall, winter, spring). В течение лета мое образование обоев вращалось бы через изображения в summer каталог ежедневно. Затем 21 сентября каталог обоев изменился бы на fall, и обои затем циклически повторились бы через те изображения ежедневно и т.д.

Я - удобная запись сценария, но где я запустил бы?

Как этот вопрос уникален

Править: Разъясниться далее о том, что делает этот вопрос уникальным. В то время как существует много методов для создания слайд-шоу, они все зависят от установки каталога изображений. То, что я спрашиваю, - то, как динамично изменить каталог изображений. Таким образом, показ слайдов сегодня выходит /images/winter/ каталог и показ слайдов пружиной выходят /images/spring/ каталог. Я мог вручную сделать это, просто изменив каталог в настройках появления каждый сезон, но я не хочу иметь к этому, когда я могу сказать компьютеру делать это для меня.

5
задан 15 December 2018 в 11:06

4 ответа

Основной вопрос состоит в том, как сделать что-то в начале Spring, Лето, Осень и Зима. Для этого я создал бы сценарий удара, который работает на начальной загрузке, вместо того, чтобы засориться cron с записями.

Я приблизился к этому ответу с помощью вопроса OP, "Как я разрабатываю сценарий?". Таким образом, я отклонился от обычного метода простой регистрации сценария удара и улучшил ответ с:

  • Ссылки включены в рамках кода. Они связываются для Укладки ответов Exchange для решения определенных проблем. Например: Как скопировать файлы, Как получить день года и т.д.
  • Раздел по "Тестированию" обеспечивается, поскольку это - что-то, что все мы должны сделать
  • Раздел по "Улучшениям" обеспечивается, потому что программное обеспечение обычно разрабатывается в версиях, где каждый инкрементно лучше, чем предыдущая версия.

Когда сезоны запускаются?

Из альманаха фермера:

Сезоны 2018

 Season     Astronomical Start                     Meteorological Start
 ======     =====================================  =====================
 SPRING     Tuesday, March 20, 12:15 P.M. EDT      Thursday, March 1 
 SUMMER     Thursday, June 21, 6:07 A.M. EDT       Friday, June 1
 FALL       Saturday, September 22, 9:54 P.M. EDT  Saturday, September 1
 WINTER     Friday, December 21, 5:23 P.M. EST     Saturday, December 1

Преобразуйте сезонную дату начала в День года

Для нашего bash сценарий для работы мы должны знать, какой день года каждый сезоны запускают.

$ echo $(date --date="March 20" '+%j')
079
$ echo $(date --date="June 21" '+%j')
172
$ echo $(date --date="Sep 22" '+%j')
265
$ echo $(date --date="Dec 21" '+%j')
355
# Reference: https://unix.stackexchange.com/questions/352176/take-input-arguments-and-pass-them-to-date

Создайте сценарий удара: season.sh

Откройте терминальное использование: Ctrl+Alt+T

Создайте каталог, если он не существует: mkdir -p ~/bin

Отредактируйте использование сценария: gedit ~/bin/season.sh

  • Примечание: Потребность пользователя Lubuntu использовать leafpad вместо gedit

Скопируйте и вставьте следующие строки в gedit:

#!/bin/bash
# NAME: season.sh
# PATH: ~/bin
# DATE: December 15, 2018

# NOTE: Written for: https://askubuntu.com/questions/1100934/change-dynamic-wallpaper-directory-every-season/1102084#1102084

# User defined variables, change to suit your needs
# Our directory names, lines indented for cosmetic reasons only
SlideShowDir="~/Season Slide Show"
   SpringDir="~/Pictures/Spring Slide Show"
   SummerDir="~/Pictures/Summer Slide Show"
     FallDir="~/Pictures/Fall Slide Show"
   WinterDir="~/Pictures/Winter Slide Show"

CheckTripWire () {
    # Our last season is in "~/Season Slide Show/CurrentSeason"
    LastSeasonFilename="$SlideShowDir"/CurrentSeason
    LastSeason=$(cat "$LastSeasonFilename")

    [[ "$LastSeason" == "$Season" ]] && return 0 # Season still the same

    # We now know our season has changed.

    rm -f "$SlideShowDir"/{*,.*}           # Erase all files in target
    # Reference: https://askubuntu.com/questions/60228/how-to-remove-all-files-from-a-directory

    echo "$Season" > "$LastSeasonFilename" # Record new season in target

    # Copy new slide show based on season
    if (( "$Season" == SPRING)) ; then
        cp -R "$SpringDir"/. "$SlideShowDir"/
        # Reference: https://stackoverflow.com/questions/3643848/copy-files-from-one-directory-into-an-existing-directory
    elif (( "$Season" == SUMMER)) ; then
        cp -R "$SummerDir"/. "$SlideShowDir"/
    elif (( "$Season" == FALL)) ; then
        cp -R "$FallDir"/. "$SlideShowDir"/
    else
        cp -R "$WinterDir"/. "$SlideShowDir"/
    fi

} # End of CheckTripWire () function.

# Start of Mainline

DOY=$(date '+%j')                     # DOY = Current Day of Year
# Reference: https://stackoverflow.com/questions/10112453/how-to-get-day-of-the-year-in-shell

if ((DOY>=079 && DOY<172)) ; then
    Season="SPRING"                   # Spring has sprung!
    # Reference: https://stackoverflow.com/questions/12614011/using-case-for-a-range-of-numbers-in-bash
elif ((DOY>=172 && DOY<265)) ; then
    Season="SUMMER"                   # Hit the beach!
elif ((DOY>=265 && DOY<355)) ; then
    Season="FALL"                     # Rake those leaves!
else
    Season="WINTER"                   # Shovel the snow!
fi

# Current season establish, now see if we tripped the wire
CheckTripWire

exit 0 # Command not necessary but good habit to signify no Abend.

Сохраните файл в gedit. Теперь отметьте его как исполняемое использование:

chmod a+x ~/bin/season.sh

Затем мы должны добавить его для запущения приложений. Ссылка: Как я запускаю приложения автоматически на входе в систему?

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


Тестирование

Вы захотите протестировать season.sh сценарий, когда Вы создаете его и не ожидаете год, чтобы видеть, работает ли это правильно или нет. Ссылка: https://serverfault.com/questions/138325/faking-the-date-for-a-specific-shell-session


Улучшения

После начальной разработки сценария распространено улучшить его Дни, Недели, Месяцы или даже несколько лет спустя. В этом разделе рассматриваются некоторые улучшения, к которым Вы могли бы хотеть сделать session.sh в будущем.

Файлы сжатия для сохранения дискового пространства

Считайте хранение несезонных изображений сжатым в TAR (Ленточный архив) формат, чтобы экономить на дисковом пространстве. Затем замените cp Команда (Copy) с tar команда для распаковывания файлов. Ссылка: https://www.rootusers.com/23-tar-command-examples-for-linux/:

Например, мы изменились бы:

cp -R "$SpringDir"/. "$SlideShowDir"/

Кому:

tar -xf "$SpringDir"archive.tar -C "$SlideShowDir"/

... и так далее в течение других сезонов.

Переменные установки в течение сезона запускаются

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

Рассмотрите установку Переменных для запуска сезона:

SpringStart=079
SummerStart=179
FallStart=265
WinterStart=355

Определите переменные наверху сценария для создания их легче определить и измениться. Вы могли бы хотеть сделать это в течение високосных годов. Вы могли бы хотеть измениться на "Метеорологический" сезон, запускается вместо "Астрономических" дат начала.

Затем измените эти строки:

if ((DOY>=079 && DOY<172)) ; then
elif ((DOY>=172 && DOY<265)) ; then
elif ((DOY>=265 && DOY<355)) ; then

К этому:

if ((DOY>="$SpringStart" && DOY<"$SummerStart")) ; then
elif ((DOY>="$SummerStart" && DOY<"$FallStart")) ; then
elif ((DOY>="$FallStart" && DOY<"$WinterStart")) ; then

Примечание: Я надеялся закончить этот ответ через час, но это были два часа, и я должен сделать однажды в субботу, Делая покупки. Продолжение следует...

1
ответ дан 23 November 2019 в 10:25

Возможно, это - более легкий путь:

  1. Создайте символьную ссылку из ~/images/mybackgrounds кому: ~/images/spring:

    ln -s ~/images/spring ~/images/mybackgrounds
    
  2. Используйте один из этих методов для отображения фонового слайд-шоу с помощью изображений от ~/images/mybackgrounds.

  3. Настроенные crontab записи для изменения символьной ссылки в конкретные дни. Создайте названный файл ~/mycrontab с этим содержанием:

    # min  hr     day     mon  dow
    0      9      21      3    *     ln -sf ~/images/spring ~/images/mybackgrounds
    0      9      21      6    *     ln -sf ~/images/summer ~/images/mybackgrounds
    0      9      21      9    *     ln -sf ~/images/fall ~/images/mybackgrounds
    0      9      21      12   *     ln -sf ~/images/winter ~/images/mybackgrounds
    

    Выполненный

    crontab ~/mycrontab
    

    зарегистрировать crontab записи. 21 марта в 9:00, crond выполнит команду

    ln -sf ~/images/spring ~/images/mybackgrounds
    

таким образом соединение ~/images/mybackgrounds кому: ~/images/spring. 21 июня в 9:00, crond изменит символьную ссылку так, чтобы ~/images/mybackgrounds точки к ~/images/summer. Программа слайд-шоу настроена для выбора файла из ~/images/mybackgrounds. Путь к ~/images/mybackgrounds остается таким же, но теперь все содержание отличается, потому что символьная ссылка указывает на другое местоположение. crontab записи на 21 сентября и 21 декабря вытягивают тот же прием.

2
ответ дан 23 November 2019 в 10:25

Шаг 1: Создайте slideshow.py сценарий

Сохраните это в названном файле ~/bin/slideshow.py:

#!/usr/bin/env python
import os
import datetime as DT
import itertools as IT
import bisect
import random
import subprocess

# customize cutoffs and image_dirs however you like, but note that there must be
# the same number of items in each, and the items in cutoffs must be in sorted order.
cutoffs = [(3, 21), (6, 21), (9, 21), (12, 21)]
image_dirs = ['~/images/winter', '~/images/spring', '~/images/summer', '~/images/fall']
image_dirs = list(map(os.path.expanduser, image_dirs))

today = DT.date.today()
year = today.year

# convert the cutoffs to actual dates
cutoff_dates = [DT.date(year, m, d) for m, d in cutoffs]
# find the index into cutoff_dates where today would fit and still keep the list sorted
idx = bisect.bisect(cutoff_dates, today)
# use idx to get the corresponding image directory 
image_dir = next(IT.islice(IT.cycle(image_dirs), idx, idx+1))

# list all the files in image_dir (even in subdirectories, and following symlinks)
files = [os.path.join(root, filename)
         for root, dirs, files in os.walk(image_dirs[idx], followlinks=True)
         for filename in files]
# pick a file at random
imagefile = os.path.abspath(random.choice(files))

# find the current process's effective user id (EUID)
euid = str(os.geteuid())
# find the pid of the current EUID's gnome-session
pid = subprocess.check_output(['pgrep', '--euid', euid, 'gnome-session']).strip().decode()
# load all the environment variables of gnome-session
env = open('/proc/{}/environ'.format(pid), 'rb').read().strip(b'\x00')
env = dict([item.split(b'=', 1) for item in env.split(b'\x00')])
# get the value of DBUS_SESSION_BUS_ADDRESS environment variable
key = b'DBUS_SESSION_BUS_ADDRESS'
env = {key: env[key]}
# call gsettings to change the background to display the selected file
# with the DBUS_SESSION_BUS_ADDRESS environment variable set appropriately
subprocess.call(['gsettings', 'set', 'org.gnome.desktop.background', 'picture-uri',
                 'file://{}'.format(imagefile)], env=env)

Шаг 2: Сделайте это исполняемым файлом:

chmod 755 ~/bin/slideshow.py

Для тестирования этого, вещи работают как ожидалось, можно открыть терминал и работать slideshow.py неоднократно. Необходимо видеть, что фон изменяется. Отметьте это slideshow.py ищет изображения в одном из 4 каталогов, ~/images/spring, ~/images/summer, ~/images/fall, или ~/images/winter в зависимости от сезона.

Шаг 3: Настройте crontab

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

Сделайте файл названным, скажем, ~/mycrontab, и вставленный что-то вроде этого:

# min  hr     day     mon  dow
# 0      9      *       *    *    ~/bin/slideshow.py   # run once at 9AM
*      *      *       *    *    ~/bin/slideshow.py   # run once every minute

Затем выполненный

crontab ~/mycrontab

зарегистрировать изменение в Вашем crontab.

Необходимо теперь видеть, что фон изменяется один раз в минуту. (Вы могли бы даже любить сохранять это этим путем.)

crontab проигнорирует строки, которые начинаются #. Таким образом, если Вы хотите, чтобы фон изменился однажды в день, не прокомментировал вторую строку и прокомментировал третье так, чтобы ~/mycrontab теперь похож на это:

# min  hr     day     mon  dow
0      9      *       *    *    ~/bin/slideshow.py   # run once at 9AM
# *      *      *       *    *    ~/bin/slideshow.py   # run once every minute

Обратите внимание однако, что крон только выполнит эту команду, если Вы будете зарегистрированы в машину в 9:00 в тот день.

0
ответ дан 23 November 2019 в 10:25
  1. Создайте папку SeasonalWallPapers в home каталог ~/SeasonalWallPapers
  2. Создайте подпапки в ~/SeasonalWallPapers Падение, Spring, лето и зима.
    • Сохраните только .jpg файлы в вышеупомянутых четырех папках как сценарий изменяются только для взятия .jpg файлы

enter image description here

  • Отметьте в ниже изображений .xml файлы сгенерированы сценариями. Вы не должны создавать беспокойство / об этом.

enter image description here

enter image description here

enter image description here

enter image description here

  1. Создайте 4 Сценария с ниже содержания в каждой из этих четырех папок выше.
    FWP.sh, RWP.sh, SWP.sh & WWP.sh

Примечание: измените 3-ю строку в ниже сценария FILE="FWP.xml" в других трех файлах сценария для создания их FILE=RWP.xml, FILE=SWP.xml & FILE=WWP.xml.

Примечание: в ниже сценария Продолжительность установлен на 2 секунды только. в фактическом для каждого дневного изменения обоев, набор это к 86400

#!/bin/bash

FILE="FWP.xml"
DURATION=2.0
TRANSITION=0.0

CURRENTDIR=$PWD
TRANSITION_XML="
<static>
    <duration>$DURATION</duration>
    <file>$CURRENTDIR/%s</file>
</static>
<transition>
    <duration>$TRANSITION</duration>
    <from>$CURRENTDIR/%s</from>
    <to>$CURRENTDIR/%s</to>
</transition>
"

# Random order
IMGS=( *.jpg )
INDICES=( $(shuf -e ${!IMGS[@]}) ) # randomize indices of images
INDICES+=(${INDICES[0]})           # go back to first image after last
COUNTER=${#IMGS[@]}

exec > "$FILE"                     # all further output to the XML file
echo "<background><starttime></starttime>"

for ((i = 0; i < COUNTER; i++))
do
    index=${INDICES[i]}
    printf "$TRANSITION_XML" "${IMGS[index]}" "${IMGS[index]}" "${IMGS[index + 1]}"
done

echo "</background>"
  1. сделайте исполняемый файл документов на получение с

chmod +x ~/SeasonalWallPapers/Fall/FWP.sh
chmod +x ~/SeasonalWallPapers/Spring/RWP.sh
chmod +x ~/SeasonalWallPapers/Summer/SWP.sh
chmod +x ~/SeasonalWallPapers/Winter/WWP.sh

  1. Создайте названный сценарий WP.sh с ниже содержания.
#! /bin/bash

cd ~/SeasonalWallPapers/Summer/ && ./SWP.sh
cd ~/SeasonalWallPapers/Fall/ && ./FWP.sh
cd ~/SeasonalWallPapers/Winter && ./WWP.sh
cd ~/SeasonalWallPapers/Spring && ./RWP.sh
  1. Сделайте сценарий WP.sh исполняемый файл с chmod +x ~/SeasonalWallPapers/WP.sh

*Этот Сценарий WP.sh основной источник для нас здесь-опека.
когда когда-либо мы добавляем или удаляем любые изменения в тех 4 папках для изображений.. мы должны запустить этот скрипт для обновления .xml файлы

  1. Выполните команду для генерации требуемый .xml files
    ~/SeasonalWallPapers/WP.sh

Пример:

$ ~/SeasonalWallPapers/WP.sh
$ 

*Когда мы запускаем этот Скрипт WP.sh это генерирует .xml файлы в каждой папке с обновленными названными обоями FWP.xml, RWP.xml, SWP.xml & WWP.xml

теперь мы должны установить любой из этих четырех .xml файлы согласно нашей потребности.

  1. gsettings set org.gnome.desktop.background picture-uri 'file:///home/user-name/SeasonalWallPapers/Fall/FWP.xml' #change имя пользователя с Вашим.

Пример:

$ gsettings set org.gnome.desktop.background picture-uri 'file:///home/pratap/SeasonalWallPapers/Fall/FWP.xml'
$ 

теперь, когда когда-либо Вы хотите, можно установить необходимые обои с ниже команд

gsettings set org.gnome.desktop.background picture-uri 'file:///home/pratap/SeasonalWallPapers/Fall/FWP.xml'

gsettings set org.gnome.desktop.background picture-uri 'file:///home/pratap/SeasonalWallPapers/Winter/WWP.xml'

gsettings set org.gnome.desktop.background picture-uri 'file:///home/pratap/SeasonalWallPapers/Spring/RWP.xml'

gsettings set org.gnome.desktop.background picture-uri 'file:///home/pratap/SeasonalWallPapers/Summer/SWP.xml'

enter image description here

enter image description here

enter image description here

enter image description here

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

0 0 1 12 * root gsettings set org.gnome.desktop.background picture-uri 'file:///home/pratap/SeasonalWallPapers/Fall/FWP.xml'
0 0 1 6 * root gsettings set org.gnome.desktop.background picture-uri 'file:///home/pratap/SeasonalWallPapers/Winter/WWP.xml'
0 0 1 9 * root gsettings set org.gnome.desktop.background picture-uri 'file:///home/pratap/SeasonalWallPapers/Spring/RWP.xml'
0 0 1 3 * root gsettings set org.gnome.desktop.background picture-uri 'file:///home/pratap/SeasonalWallPapers/Summer/SWP.xml'
0
ответ дан 23 November 2019 в 10:25

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

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