研究了下Ubuntu怎么自动切换壁纸。其实,感觉还是很简单的,主要就是修改目录/usr/share/backgrouds/contest/trusty.xml的配置文件。
它的格式是这样的:
1 <background>
2 <starttime>
3 <year>2009</year>
4 <month>08</month>
5 <day>04</day>
6 <hour>00</hour>
7 <minute>00</minute>
8 <second>00</second>
9 </starttime>
10 <!-- This animation will start at midnight. -->
11 <static>
12 <duration>1795.0</duration>
13 <file>/usr/share/backgrounds/1.jpg</file>
14 </static>
15 <transition>
16 <duration>5.0</duration>
17 <from>/usr/share/backgrounds/1.jpg</from>
18 <to>/usr/share/backgrounds/2.jpg</to>
19 </transition>
20 <static>
21 <duration>1795.0</duration>
22 <file>/usr/share/backgrounds/2.jpg</file>
23 </static>
24 <transition>
25 <duration>5.0</duration>
26 <from>/usr/share/backgrounds/2.jpg</from>
27 <to>/usr/share/backgrounds/3.jpg</to>
28 </transition>
29 <static>
30 <duration>1795.0</duration>
31 <file>/usr/share/backgrounds/3.jpg</file>
32 </static>
33 <transition>
34 <duration>5.0</duration>
35 <from>/usr/share/backgrounds/3.jpg</from>
36 <to>/usr/share/backgrounds/1.jpg</to>
37 </transition>
38 </background>
主要就是修改文件名称和切换的时间,很容易看懂。
但是,实际要是修改这么多,肯定是很麻烦的,所以,我就花了点时间写了个自动生成上述配置的脚本出来。当然,由于是第一次认认真真地写脚本,中间也遇到了不少问题,好在最终都解决了。脚本也能如期运行了。
Shell脚本代码如下:
1 #!/bin/bash
2 # Program:
3 #
4 # Author: Leomon
5 # Email: 1964416932@qq.com
6 # Blog: blog.csdn.net/leomon_1993
7 #
8 # History:
9 # 2014/5-2014/6 First Release.
10 #
11 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
12 export PATH
13
14 #Variables
15 #源(壁纸)目录
16 source=
17 #目标地址
18 destination=/usr/share/backgrounds
19 #目标文件夹的名称
20 dest_name="pictures"
21 #目标文件列表
22 filelist=
23 #配置文件名称
24 conf_file_name="trusty.xml"
25 #标志标量,1表示第一次循环开始。
26 flag="1"
27 #图片静止的时间
28 s_duration=1795.0
29 t_duration=5.0
30 #End of Variables
31
32 #Functions
33
34 #函数:用来生成节点<starttime></starttime>
35 function Create_Starttime
36 {
37 echo -e "\t<starttime>" >>$conf_file_name
38 echo -e "\t\t<year>2014</year>" >>$conf_file_name
39 echo -e "\t\t<month>01</month>" >>$conf_file_name
40 echo -e "\t\t<day>01</day>" >>$conf_file_name
41 echo -e "\t\t<hour>00</hour>" >>$conf_file_name
42 echo -e "\t\t<minute>00</minute>" >>$conf_file_name
43 echo -e "\t\t<second>00</second>" >>$conf_file_name
44 echo -e "\t</starttime>" >>$conf_file_name
45 }
46
47 #函数:用来生成幻灯片动画配置节点
48 function Create_Animation ()
49 {
50 if [[ "$#" == "4" ]]; then
51 static_duration=$1
52 transition_duration=$2
53 from_picture=$3
54 to_picture=$4
55 echo "++from picture [$from_picture] to [$to_picture]."
56 echo -e "\t<static>" >>$conf_file_name
57 echo -e "\t\t<duration>$static_duration</duration>" >>$conf_file_name
58 echo -e "\t\t<file>$from_picture</file>" >>$conf_file_name
59 echo -e "\t</static>" >>$conf_file_name
60
61 echo -e "\t<transition>" >>$conf_file_name
62 echo -e "\t\t<duration>$transition_duration</duration>" >>$conf_file_name
63 echo -e "\t\t<from>$from_picture</from>" >>$conf_file_name
64 echo -e "\t\t<to>$to_picture</to>" >>$conf_file_name
65 echo -e "\t</transition>" >>$conf_file_name
66 else
67 echo "+参数个数不匹配,无法生成!"
68 fi
69 }
70
71 #End of Functions
72 #Clear the screen..
73 clear
74 #首先判断下参数个数是否为1,并且后面接的是一个目录
75 if [[ "$#" == "1" ]]; then
76 if [[ -d "$1" ]]; then
77 source=$1
78 else
79 echo "+Err:后面连接的参数非目录,退出!"
80 exit 0
81 fi
82 else
83 echo "+Err:参数个数不为1,退出!"
84 exit 0
85 fi
86
87 #这儿开始咯。。。。
88 echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
89 echo "+ 欢迎使用 +"
90 echo "+脚本名称:slide_wallpaper_creator. +"
91 echo "+脚本功能:自动生成幻灯片壁纸配置,让您的桌面壁纸自动切换 +"
92 echo "+作者:@leomon +"
93 echo "+版本:version 0.1 +"
94 echo "+更改日志:无 +"
95 echo "+注意:该脚本只适用于Ubuntu14.04 Desktop版本,其他的版本自+"
96 echo "+行测试修改。具体参见README文件说明。 +"
97 echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
98 read -p "+继续执行脚本?(y/n)" yn
99 case $yn in
100 "y")
101 ;;
102 "n")
103 echo "+停止执行."
104 exit 0
105 ;;
106 esac
107
108 #首先将所有的壁纸复制到指定的位置
109 read -p "+将要把 $source 中所有图片复制到 $destination/$dest_name, 您需要重命名目标文件夹吗?(y/n)" yn
110 case $yn in
111 "y")
112 echo "++当前目标文件夹名称是:$dest_name."
113 read -p "++输入新的名称:" dest_name
114 echo "++好的,您已成功更新目标文件夹名称为:$dest_name"
115 ;;
116 *)
117 ;;
118 esac
119 #开始复制图片到目标文件夹中
120 destination="$destination/$dest_name"
121 if [ ! -d $destination ];then
122 echo "+正在生成目录$destination"
123 mkdir $destination
124 echo "+正在复制图片到$destination..."
125 cd $source
126 cp ./* $destination
127 echo -e "+复制完毕!\n"
128 else
129 echo "+检测到有相同的目录,停止复制图片..."
130 fi
131
132 #进入目标目录
133 echo "+进入目标目录..."
134 cd $destination
135 #修改权限
136 chmod 444 ./*
137
138 #准备生成配置文件
139 echo -e "+正在生成配置文件,请稍等..."
140 test -f $conf_file_name && rm -f $conf_file_name
141
142 #生成头节点
143 echo "+添加起始节点..."
144 echo "<background>" >>$conf_file_name
145
146 #添加起始时间节点
147 echo "+添加起始时间节点..."
148 Create_Starttime
149
150 echo "+准备添加动画切换节点..."
151 echo -e "\n<!--This animation will start at midnight.-->" >>$conf_file_name
152
153 #配置切换动画时间
154 read -p "+是否使用默认的壁纸切换配置?(y/n)" yn
155 case $yn in
156 "y" )
157 ;;
158 "n")
159 read -p "设置每张壁纸静止的时间(默认为1795.0,单位:秒):" s_duration
160 read -p "设置壁纸切换的时间间隔(默认为5.0,单位:秒):" t_duration
161 ;;
162 *)
163 echo "输入有误!使用默认的切换配置."
164 ;;
165 esac
166
167 #获取文件列表
168 echo "++正在获取图片列表..."
169 #将空格替换成?来处理
170 filelist=`ls | tr " " "\?"`
171 #遍历可以得到整个目录
172 from=
173 to=
174 first=
175 for filename in $filelist
176 do
177 case $filename in
178 "filenames")
179 ;;
180 "$conf_file_name")
181 ;;
182 *)
183 case $flag in
184 "1")
185 from="$destination/$filename"
186 first=$from
187 to=$from
188 flag="0"
189 ;;
190 "0")
191 from=$to
192 to="$destination/$filename"
193 #echo $from
194 #echo $to
195 #调用函数生成新节点
196 Create_Animation "$s_duration" "$t_duration" "$from" "$to"
197 #为了显示出来动态的效果,遂采用进程睡眠的方式来实现。。。
198 sleep 0.05
199 ;;
200 esac
201 ;;
202 esac
203 done
204 #循环回去
205 Create_Animation "$s_duration" "$t_duration" "$to" "$first"
206
207 echo "+添加尾节点..."
208 echo "</background>" >>$conf_file_name
209
210 echo "+Ubuntu 幻灯片壁纸配置文件生成完毕!"
211
212 #下面将生成的配置文件存放到contest目录中,并重新命名为trusty.xml
213 cd ..
214
215 test -d contest && echo "+检测到目录contest." || (echo "+新建目录:contest";mkdir contest)
216 cd contest
217
218 #查看目录中有没有已经存在的配置文件,并询问用户如何处理旧的配置文件
219 if [[ -f "$conf_file_name" ]]; then
220 read -p "+发现同名的配置文件,直接覆盖?(y/n)" yn
221 case $yn in
222 "y")
223 ;;
224 "n")
225 echo "+正在备份旧的配置文件..."
226 #为防止重名,使用带有时间的后缀名称。
227 mv $conf_file_name ${conf_file_name}.`date +%H_%M_%S`back
228 ;;
229 "*")
230 ;;
231 esac
232 fi
233 #复制配置文件过来
234 echo "+复制配置文件到`pwd`..."
235 cp "$destination/$conf_file_name" ./
236
237 #完成了
238 echo "+Success! 请在桌面空白处右键菜单,选择更换桌面背景项进行设置。谢谢您的使用!"
239 #Return status to System.
240 exit 0
脚本运行的过程如下:
其实,脚本工作的很正常,个人觉得没什么问题。可以看到它生成的配置文件如下:
1 <background>
2 <starttime>
3 <year>2014</year>
4 <month>01</month>
5 <day>01</day>
6 <hour>00</hour>
7 <minute>00</minute>
8 <second>00</second>
9 </starttime>
10
11 <!--This animation will start at midnight.-->
12 <static>
13 <duration>1795.0</duration>
14 <file>/home/leomon/pictures/1.jpg</file>
15 </static>
16 <transition>
17 <duration>5.0</duration>
18 <from>/home/leomon/pictures/1.jpg</from>
19 <to>/home/leomon/pictures/2.jpg</to>
20 </transition>
21 <static>
22 <duration>1795.0</duration>
23 <file>/home/leomon/pictures/2.jpg</file>
24 </static>
25 <transition>
26 <duration>5.0</duration>
27 <from>/home/leomon/pictures/2.jpg</from>
28 <to>/home/leomon/pictures/3.jpg</to>
29 </transition>
30 <static>
31 <duration>1795.0</duration>
32 <file>/home/leomon/pictures/3.jpg</file>
33 </static>
34 <transition>
35 <duration>5.0</duration>
36 <from>/home/leomon/pictures/3.jpg</from>
37 <to>/home/leomon/pictures/4.jpg</to>
38 </transition>
39 <static>
40 <duration>1795.0</duration>
41 <file>/home/leomon/pictures/4.jpg</file>
42 </static>
43 <transition>
44 <duration>5.0</duration>
45 <from>/home/leomon/pictures/4.jpg</from>
46 <to>/home/leomon/pictures/5.jpg</to>
47 </transition>
48 <static>
49 <duration>1795.0</duration>
50 <file>/home/leomon/pictures/5.jpg</file>
51 </static>
52 <transition>
53 <duration>5.0</duration>
54 <from>/home/leomon/pictures/5.jpg</from>
55 <to>/home/leomon/pictures/1.jpg</to>
56 </transition>
57 </background>
但是,我把配置文件复制到目录/usr/share/backgrounds/contest中替换掉,然后在桌面中进行壁纸切换时,发现实际效果并不正常,不论怎么做,桌面就是变成黑色的了。总之到目前为止还没有发现是何缘故。下面是替换后的截图:
无意中发现位于/usr/share/backgrounds/pictures中的图片全部无法查看,很自然地想到是权限设定的问题,查看了一下图片文件权限为-r--------,显然,root无法读取。又一次栽倒在权限设定上,谨记之!
当修改了图片文件的权限后,一切都正常了!方法很简单,在脚本中复制图片代码的后面加上chmod 444 ./*即可解决。