ubuntu 壁纸自动换 脚本1(软连接方式)

sh/bash/dash/ksh/zsh等Shell脚本
回复
ddrock
帖子: 10
注册时间: 2008-04-27 12:14

ubuntu 壁纸自动换 脚本1(软连接方式)

#1

帖子 ddrock » 2011-04-27 19:47

虽然很久前就知道ubuntu了,但是一直到这个月初才开始正是学习和使用,在win下习惯了自动更换壁纸的功能,在ubuntu下也能实现,但步骤有点繁琐,尤其是生成xml文件时,三五张图片无所谓,但是有上百张时就痛苦了,原来在win下用易语言变了个小程序生成xml文件,后来一想,既然决定使用ubuntu了,就要用ubuntu的方式来思考和解决问题,于是学习了一点shell的知识,编写了一下脚本,希望走过路过看过的都给提点意见,第一个脚本,不要笑话我…… :em03

代码开始:

代码: 全选

    

#!/bin/bash

#  此脚本用来实现ubuntu的自动更换壁纸的功能
#  准备工作:1.将要做背景的jpg图片集中到一个文件夹    2.脚本部分命令用sudo执行,需要输入密码   3.不须事先带参数,执行后有提示,按提示输入即可(也许带参数更方便)
#  为节省空间,此脚本是用软链接将装有图片的文件夹链接到ubuntu特定的背景文件夹下的,图片格式要jpg的(其他格式可在脚本中修改)

echo  "请输入存放背景图片的文件夹的绝对路径,如:/home/username/photo"
read lj
num=`echo $lj | wc -c`
num=`expr $num - 2`
zf=`echo $lj | cut -c 1 `
if [  "$zf" = "'"  ];then
lj=`echo $lj | cut -c 2-$num`
fi

num=`echo $lj | wc -c`
num=`expr $num - 1`
zf=`echo $lj | cut -c $num `
if [  "$zf" = '/'   ];then
num=`expr $num - 1`
lj=`echo $lj | cut -c 1-$num `
else
lj=${lj}
fi
# ----------------以上代码对输入的路径进行处理,去掉结尾的'和/(如果有的话)


i=2
string=`echo $lj | cut -d "/" -f$i   `
until [  "$string" = ""  ];do
string=`echo $lj | cut -d "/" -f$i   `
i=`expr $i + 1`
done
i=`expr $i  - 2`
mulu=`echo $lj | cut -d "/" -f$i   `
#  -------------以上代码取得路径的最后一个文件夹   如:/home/$user/background/   将得到 background ,用以下面的创建链接

sudo ln -s $lj  /usr/share/backgrounds/$mulu

#--------------------------------------------------------------------------

cat  /usr/share/backgrounds/cosmos/background-1.xml  | head >  ${lj}/background-1.xml 

echo "请输入每幅图片显示的时间(单位:秒):"
read t
x1="<static><duration>"
x2=".0</duration><file>"
x3="</file></static><transition><duration>5.0</duration><from>"
x4="</from><to>"
x5="</to></transition>"

i=1
n=`ls ${lj}/*.jpg | wc -l`
#  统计后缀为jpg的文件个数,即 循环的次数
while [ $i -le $n  ]
do

name1=`ls /usr/share/backgrounds/${mulu}/*.jpg | head -n $i | tail -n 1`
# 依次得到第一第二第三……个文件的文件名(含绝对路径)
ii=`expr $i + 1`
if [ $ii -gt $n    ];then
ii=1
fi
name2=`ls /usr/share/backgrounds/${mulu}/*.jpg | head -n $ii | tail -n 1`

echo $x1$t$x2$name1$x3$name1$x4$name2$x5 >> ${lj}/background-1.xml 
i=`expr $i + 1`

done

echo "</background>" >> ${lj}/background-1.xml 
#------------------------------------以上代码生成background-1.xml 文件,用以控制背景图片出现的顺序、停留的时间、以及置换时间
#  x1后面跟显示时间,x2后面跟第一幅图的地址,x3后面也跟第一幅图的地址,x4后面跟第二幅图的地址,




sudo  sed  "/filename/s/cosmos/$mulu/g;s/宇宙/$mulu/g"  /usr/share/gnome-background-properties/cosmos.xml > ${lj}/${mulu}.xml
sudo mv -f ${lj}/${mulu}.xml  /usr/share/gnome-background-properties/

头像
iamond
帖子: 719
注册时间: 2010-03-23 12:40

Re: ubuntu 壁纸自动换 脚本1(软连接方式)

#2

帖子 iamond » 2011-04-27 21:51

虽然LZ说,用了UBUNTU就应该用UBUNTU的思维方式之类的话,说的是很对。。。不过ubuntu的思维方式应该不是指的一定要命令,要语言,要脚本 吧?

推荐LZ一个软件,wally,搜搜我的帖子,我以前推荐过的。。。可以自动换壁纸,可设置时间,平铺或者是居中,选择文件夹等等。。。功能比较完善,只是在11.04里不能在unity看到 图标。。。
I Kubuntu U
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: ubuntu 壁纸自动换 脚本1(软连接方式)

#3

帖子 eexpress » 2011-04-27 23:13

lz sudo权限都还没解决嘛。
当练手吧
● 鸣学
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: ubuntu 壁纸自动换 脚本1(软连接方式)

#4

帖子 fnan » 2011-04-29 3:41

练习bash不错的。
开头部分不用这么长吧:
echo "请输入存放背景图片的文件夹的绝对路径,如:/home/username/photo"
read lj
lj=$(sed -E 's#^'"'"'|/*'"'"'*$##g' <<<$lj)
# ----------------以上代码对输入的路径进行处理,去掉结尾的'和/(如果有的话)
mulu=`echo $lj |tr "/" "\n"|tail -1`
# -------------以上代码取得路径的最后一个文件夹 如:/home/$user/background/ 将得到 background ,用以下面的创建链接
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
ddrock
帖子: 10
注册时间: 2008-04-27 12:14

Re: ubuntu 壁纸自动换 脚本1(软连接方式)

#5

帖子 ddrock » 2011-04-29 18:59

iamond 写了:虽然LZ说,用了UBUNTU就应该用UBUNTU的思维方式之类的话,说的是很对。。。不过ubuntu的思维方式应该不是指的一定要命令,要语言,要脚本 吧?

推荐LZ一个软件,wally,搜搜我的帖子,我以前推荐过的。。。可以自动换壁纸,可设置时间,平铺或者是居中,选择文件夹等等。。。功能比较完善,只是在11.04里不能在unity看到 图标。。。
上网查了,下了,用了wally,确实不错。

ubuntu的思维方式应该不是指的一定要命令,要语言,要脚本 吧? 确实是,差点钻了牛角尖。
头像
Boneflame
帖子: 420
注册时间: 2010-07-10 1:19
系统: 洗发水
来自: G+阿卡林部
联系:

Re: ubuntu 壁纸自动换 脚本1(软连接方式)

#6

帖子 Boneflame » 2011-04-29 19:07

支持LZ! :em11

懒人的话可以用desktop-nova :em09
     ∧_∧::
    (´・ω・`)::
   /⌒  ⌒)::
  / へ__/ /::
  (_\\ミ)/::
   | `-イ::
   /y  )::
  // /::
  / /::
 ( く:::
 |\ ヽ:::
ddrock
帖子: 10
注册时间: 2008-04-27 12:14

Re: ubuntu 壁纸自动换 脚本1(软连接方式)

#7

帖子 ddrock » 2011-04-30 18:45

开头部分不用这么长吧:
echo "请输入存放背景图片的文件夹的绝对路径,如:/home/username/photo"
read lj
lj=$(sed -E 's#^'"'"'|/*'"'"'*$##g' <<<$lj)
# ----------------以上代码对输入的路径进行处理,去掉结尾的'和/(如果有的话)
代码执行出错了,请 fnan 检查下,感谢回帖及提出的改进,受启发,自己也改进了一下:

代码: 全选

echo  "请输入存放背景图片的文件夹的绝对路径,如:/home/username/photo"
read lj
num=`echo $lj | wc -c`
num=`expr $num - 2`
zf=`echo $lj | cut -c 1 `
if [  "$zf" = "'"  ];then
lj=`echo $lj | cut -c 2-$num`
fi

num=`echo $lj | wc -c`
num=`expr $num - 1`
zf=`echo $lj | cut -c $num `
if [  "$zf" = '/'   ];then
num=`expr $num - 1`
lj=`echo $lj | cut -c 1-$num `
else
lj=${lj}
fi
# ----------------以上代码对输入的路径进行处理,去掉结尾的'和/(如果有的话)
可以精简为以下两段代码:

代码: 全选

  echo  "请输入存放背景图片的文件夹的绝对路径,如:/home/username/photo"
  read lj
 lj=`echo $lj | tr -d "'" `
# ----------------以上代码对输入的路径进行处理,去掉结尾的'(如果有的话)

代码: 全选


#   name=`basename $lj`
#   lj=`echo $lj | sed "s/${name}\//${name}/g" `
# ----------------以上代码对输入的路径进行处理,去掉结尾的/(如果有的话)

下面这段代码也可以精简:

代码: 全选

i=2
string=`echo $lj | cut -d "/" -f$i   `
until [  "$string" = ""  ];do
string=`echo $lj | cut -d "/" -f$i   `
i=`expr $i + 1`
done
i=`expr $i  - 2`
mulu=`echo $lj | cut -d "/" -f$i   `
#  -------------以上代码取得路径的最后一个文件夹   如:/home/$user/background/   将得到 background ,用以下面的创建链接
精简为:

代码: 全选

mulu=`basename $lj`
回复