Я хочу иметь свои обои быть сезонным (лето, осень, зима, пружина), но также и обновление ежедневно с сезонными тематическими обоями.
Таким образом, по существу я думаю о наличии 4 каталогов (summer, fall, winter, spring
). В течение лета мое образование обоев вращалось бы через изображения в summer
каталог ежедневно. Затем 21 сентября каталог обоев изменился бы на fall
, и обои затем циклически повторились бы через те изображения ежедневно и т.д.
Я - удобная запись сценария, но где я запустил бы?
Править: Разъясниться далее о том, что делает этот вопрос уникальным. В то время как существует много методов для создания слайд-шоу, они все зависят от установки каталога изображений. То, что я спрашиваю, - то, как динамично изменить каталог изображений. Таким образом, показ слайдов сегодня выходит /images/winter/
каталог и показ слайдов пружиной выходят /images/spring/
каталог. Я мог вручную сделать это, просто изменив каталог в настройках появления каждый сезон, но я не хочу иметь к этому, когда я могу сказать компьютеру делать это для меня.
Основной вопрос состоит в том, как сделать что-то в начале Spring, Лето, Осень и Зима. Для этого я создал бы сценарий удара, который работает на начальной загрузке, вместо того, чтобы засориться cron
с записями.
Я приблизился к этому ответу с помощью вопроса OP, "Как я разрабатываю сценарий?". Таким образом, я отклонился от обычного метода простой регистрации сценария удара и улучшил ответ с:
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
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
Примечание: Я надеялся закончить этот ответ через час, но это были два часа, и я должен сделать однажды в субботу, Делая покупки. Продолжение следует...
Возможно, это - более легкий путь:
Создайте символьную ссылку из ~/images/mybackgrounds
кому: ~/images/spring
:
ln -s ~/images/spring ~/images/mybackgrounds
Используйте один из этих методов для отображения фонового слайд-шоу с помощью изображений от ~/images/mybackgrounds
.
Настроенные 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 декабря вытягивают тот же прием.
Сохраните это в названном файле ~/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)
chmod 755 ~/bin/slideshow.py
Для тестирования этого, вещи работают как ожидалось, можно открыть терминал и работать slideshow.py
неоднократно. Необходимо видеть, что фон изменяется. Отметьте это slideshow.py
ищет изображения в одном из 4 каталогов, ~/images/spring
, ~/images/summer
, ~/images/fall
, или ~/images/winter
в зависимости от сезона.
Можно использовать крон для периодического выполнения команды для изменения фона, скажем, один раз в день или один раз в мелкие минуты.
Сделайте файл названным, скажем, ~/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 в тот день.
home
каталог ~/SeasonalWallPapers
~/SeasonalWallPapers
Падение, Spring, лето и зима. .jpg
файлы в вышеупомянутых четырех папках как сценарий изменяются только для взятия .jpg
файлы.xml
файлы сгенерированы сценариями. Вы не должны создавать беспокойство / об этом.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>"
chmod +x ~/SeasonalWallPapers/Fall/FWP.sh
chmod +x ~/SeasonalWallPapers/Spring/RWP.sh
chmod +x ~/SeasonalWallPapers/Summer/SWP.sh
chmod +x ~/SeasonalWallPapers/Winter/WWP.sh
WP.sh
с ниже содержания.#! /bin/bash
cd ~/SeasonalWallPapers/Summer/ && ./SWP.sh
cd ~/SeasonalWallPapers/Fall/ && ./FWP.sh
cd ~/SeasonalWallPapers/Winter && ./WWP.sh
cd ~/SeasonalWallPapers/Spring && ./RWP.sh
WP.sh
исполняемый файл с chmod +x ~/SeasonalWallPapers/WP.sh
*Этот Сценарий WP.sh
основной источник для нас здесь-опека.
когда когда-либо мы добавляем или удаляем любые изменения в тех 4 папках для изображений.. мы должны запустить этот скрипт для обновления .xml
файлы
.xml files
~/SeasonalWallPapers/WP.sh
Пример:
$ ~/SeasonalWallPapers/WP.sh
$
*Когда мы запускаем этот Скрипт WP.sh
это генерирует .xml
файлы в каждой папке с обновленными названными обоями FWP.xml
, RWP.xml
, SWP.xml
& WWP.xml
теперь мы должны установить любой из этих четырех .xml
файлы согласно нашей потребности.
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'
Если Вы все еще думаете для автоматизации этого, которое прибывает каждые 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'