你能写一个最简单的shell脚本来定期(比如1分钟)改变桌面壁纸吗?壁纸将被保存在特定的目录(如$HOME/wallpapers)。我只需要基本的功能。1)从$HOME/wallpapers选择随机壁纸2)设置为桌面壁纸3)将cron设置为每分钟运行一次脚本(不是问题的一部分)。
$HOME/wallpapers
qcbq4gxm1#
#!/bin/bash wallpaperdir='$HOME/wallpaper' files=($wallpaperdir/*) randompic=`printf "%s\n" "${files[RANDOM % ${#files[@]}]}"` gconftool-2 -t str --set /desktop/gnome/background/picture_filename "$randompic"
保存此脚本并使用命令“crontab -e”编辑(它会启动一个编辑器,您可以在文件末尾放置此行):
*/1 * * * * /bin/bash /path/to/script.sh
edit:我假设你使用的是gnome。如果不是,你需要编辑最后一行,因为我的例子使用的是Gnome配置工具。)要更改XFCE中的背景,您应该将带有gconftool-2的行更改为:
echo -e “# xfce backdrop list\n$randompic”>$HOME/.config/xfce4/desktop/backdrops.list killall -USR1 xfdesktop
eqzww0vc2#
我知道这个答案有点晚,但因为它可以帮助一些人,我张贴它。根据septi的代码加上一些修改,下面是我的解决方案:
#!/bin/bash wallpaperdir="$HOME/wallpaper" files=($wallpaperdir/*) randompic=`printf "%s\n" "${files[RANDOM % ${#files[@]}]}"` echo -e "# xfce backdrop list\n$randompic">$HOME/.config/xfce4/desktop/backdrop.list xfdesktop --reload
单引号必须替换为双引号,这样计算机才能正确解释$HOME部分。另外,您要编辑的文件是background.list,而不是backdrops. list。最后,我发现在这种情况下使用killall有点过分,因为您可以简单地重新加载xfdesktop。我已经在我的电脑上测试过了(Linux Mint Debian版),它看起来工作得很完美。希望能有所帮助。=)编辑:我忘了提到,在crontab中,您必须在命令之前添加DISPLAY=:0.0。
*/1 * * * * DISPLAY=:0.0 wallpaper.sh
cu6pst1q3#
这只是我对这件事的看法,我并不认为这是理想的看法。
WALLS_PATH=/path/to/images cd $WALLS_PATH while [ 1 ]; do for NEW_WALL in "$WALLS_PATH"/*; do gsettings set org.gnome.desktop.background picture-uri "file://${NEW_WALL}" sleep 1800 done done
kognpnkq4#
在更新的Ubuntu中试试这个:gsettings set org.gnome.desktop.background picture-uri file:///path/to/img.jpg(尖端来自here)
gsettings set org.gnome.desktop.background picture-uri file:///path/to/img.jpg
hgncfbus5#
对于gnome 3,您需要使用gsettings而不是gconftool。但是如果你打算通过cron来执行这个脚本,它就不会工作了。我试过很多.sh脚本,但没有一个适合我。最后,我用这个python脚本修复了它,这个脚本从一个文件夹中加载一个随机的壁纸:
#!/usr/bin/env python #coding: utf8 import os,random setup = "/path_to_folder/" + random.choice(os.listdir("/path_to_folder/")) os.system("DISPLAY=:0 GSETTINGS_BACKEND=dconf gsettings set org.gnome.desktop.background picture-uri 'file://%s'" %(setup))
希望对有我同样问题的人有帮助!
mv1qrgav6#
这在Gnome中对我很有效:
#!/bin/bash DIR="/home/user/Pictures/wallpapers" PIC=$(find $DIR -type f -maxdepth 1 | shuf -n1) gsettings set org.gnome.desktop.background picture-uri "file://$PIC"
5jdjgkvh7#
不幸的是,random函数本身并不能解决这个问题。我刚刚启动了一个随机壁纸应用程序,这是我根据自己的直觉制作的,60秒后我就可以看出我的应用程序确实提供了随机性,而Ubuntu的一个主要受信任的应用程序... Variety...完全不是。您是否注意到,random的壁纸或音乐播放列表(Shuffle)功能似乎有一个收藏夹的子集,它严重倾向于??更糟糕的是,每当这些应用程序重新启动时,它们完全忘记了之前的Shuffle以及它们在该列表中的位置,所以它们只是重新开始,再次挑选相同的收藏夹,从来没有得到随机函数的“不喜欢的”。智商145或声誉200 k的人会告诉我,我疯了,但我现在看到的壁纸,我已经几个月没有看到。我认为这与钟形曲线,启发式等。在钟形曲线边缘的选择很少被选中,而在中间的选择经常被选中,它更有可能选择0.3-0.7之间的数字,而不是0-0.3和0.7-1的总和,即使这个范围更大所以我编写了一个应用程序,强制它真正地对文件进行随机播放,并在每次随机播放中包含所有壁纸。然后记住应用程序重启时的随机播放,并记住它在随机播放列表中的位置。它会遍历所有壁纸,然后重新随机播放,重复播放,永无止境。它将在每个周期或删除随机文件时拾取新文件。接下来,我将把它和一些安装说明沿着放到GitHub上。
random
Variety
应用程序ts
import { exec } from "child_process" import { existsSync, readFileSync } from "fs" import { opendir, readFile, writeFile } from "fs/promises" import { basename, extname, join } from "path" export default class WallpaperChanger { _intervalSeconds = 60 get intervalSeconds() { return this._intervalSeconds } _wallpaperDirectory: string = '/home/toddmo/Pictures/desktop' get wallpaperDirectory(): string { return this._wallpaperDirectory } _lastPictureFile: string = './lastPicture.txt' _shuffleFilePath: string = './shuffle.txt' get shuffleFilePath(): string { return this._shuffleFilePath } _shuffleData: any[] = [] get shuffleData(): Promise<any[]> { return (async () => { if (!this._shuffleData.length) { if (!existsSync(this.shuffleFilePath)) this._shuffleData = await this.shuffle() else this._shuffleData = readFileSync(this.shuffleFilePath).toString().split('\n') } return this._shuffleData })() } set shuffleDataSync(value: any[]) { this._shuffleData = value } async wallPapers(): Promise<string[]> { var directoryFiles: any[] = [] var dir = await opendir(this.wallpaperDirectory) for await (const dirent of dir) directoryFiles.push({ name: dirent.name, path: join(this.wallpaperDirectory, dirent.name), base: basename(dirent.name, extname(dirent.name)), extension: extname(dirent.name).substring(1), }) return directoryFiles .filter((o: any) => ['png', 'jpg'].includes(o.extension.toLowerCase())) .map((o: any) => o.path) } async shuffle(): Promise<string[]> { var directoryFiles: any[] = await this.wallPapers() var shuffleFiles: any[] = [] while (shuffleFiles.length < directoryFiles.length) { var randomIndex = Math.floor(Math.random() * directoryFiles.length) if (!shuffleFiles.includes(directoryFiles[randomIndex])) { shuffleFiles.push(directoryFiles[randomIndex]) } } await writeFile(this.shuffleFilePath, shuffleFiles.join('\n')) // survive a restart this._nextPictureIndex = 0 return shuffleFiles } sleep(seconds: number) { return new Promise((resolve) => { setTimeout(resolve, seconds * 1000) }) } get nextPicture(): Promise<string> { return (async () => { var data = await this.shuffleData var nextPictureIndex = await this.nextPictureIndex var line = data[nextPictureIndex] return line })() } _nextPictureIndex: number get nextPictureIndex(): Promise<number> { return (async () => { if (this._nextPictureIndex === undefined || Number.isNaN(this._nextPictureIndex)) if (existsSync(this._lastPictureFile)) this._nextPictureIndex = parseInt((await readFile(this._lastPictureFile)).toString()) || 0 else this._nextPictureIndex = 0 return this._nextPictureIndex })() } set nextPictureIndex(value: Promise<number>) { (async () => { this._nextPictureIndex = await value await writeFile(this._lastPictureFile, this._nextPictureIndex.toString()) // survive restart })() } async setWallpaper(file) { var command: string = `gsettings set org.gnome.desktop.background picture-uri file:///${file}` return new Promise((resolve) => { exec(command, function (error, stdOut) { resolve(stdOut) }) }) } async play() { while (await this.nextPicture) { const wallPaper = await this.nextPicture await this.setWallpaper(wallPaper) await this.sleep(this.intervalSeconds) this.nextPictureIndex = (async () => { var n = await this.nextPictureIndex return n + 1 })() } } async run() { while (true) { await this.play() this.shuffleDataSync = await this.shuffle() } } } new WallpaperChanger().run()
7条答案
按热度按时间qcbq4gxm1#
保存此脚本并使用命令“crontab -e”编辑(它会启动一个编辑器,您可以在文件末尾放置此行):
edit:我假设你使用的是gnome。如果不是,你需要编辑最后一行,因为我的例子使用的是Gnome配置工具。)
要更改XFCE中的背景,您应该将带有gconftool-2的行更改为:
eqzww0vc2#
我知道这个答案有点晚,但因为它可以帮助一些人,我张贴它。
根据septi的代码加上一些修改,下面是我的解决方案:
单引号必须替换为双引号,这样计算机才能正确解释$HOME部分。另外,您要编辑的文件是background.list,而不是backdrops. list。最后,我发现在这种情况下使用killall有点过分,因为您可以简单地重新加载xfdesktop。
我已经在我的电脑上测试过了(Linux Mint Debian版),它看起来工作得很完美。
希望能有所帮助。=)
编辑:我忘了提到,在crontab中,您必须在命令之前添加DISPLAY=:0.0。
cu6pst1q3#
这只是我对这件事的看法,我并不认为这是理想的看法。
kognpnkq4#
在更新的Ubuntu中试试这个:
gsettings set org.gnome.desktop.background picture-uri file:///path/to/img.jpg
(尖端来自here)hgncfbus5#
对于gnome 3,您需要使用gsettings而不是gconftool。
但是如果你打算通过cron来执行这个脚本,它就不会工作了。
我试过很多.sh脚本,但没有一个适合我。
最后,我用这个python脚本修复了它,这个脚本从一个文件夹中加载一个随机的壁纸:
希望对有我同样问题的人有帮助!
mv1qrgav6#
这在Gnome中对我很有效:
5jdjgkvh7#
不幸的是,
random
函数本身并不能解决这个问题。我刚刚启动了一个随机壁纸应用程序,这是我根据自己的直觉制作的,60秒后我就可以看出我的应用程序确实提供了随机性,而Ubuntu的一个主要受信任的应用程序...
Variety
...完全不是。您是否注意到,
random
的壁纸或音乐播放列表(Shuffle)功能似乎有一个收藏夹的子集,它严重倾向于??更糟糕的是,每当这些应用程序重新启动时,它们完全忘记了之前的Shuffle以及它们在该列表中的位置,所以它们只是重新开始,再次挑选相同的收藏夹,从来没有得到随机函数的“不喜欢的”。智商145或声誉200 k的人会告诉我,我疯了,但我现在看到的壁纸,我已经几个月没有看到。我认为这与钟形曲线,启发式等。在钟形曲线边缘的选择很少被选中,而在中间的选择经常被选中,它更有可能选择0.3-0.7之间的数字,而不是0-0.3和0.7-1的总和,即使这个范围更大所以我编写了一个应用程序,强制它真正地对文件进行随机播放,并在每次随机播放中包含所有壁纸。然后记住应用程序重启时的随机播放,并记住它在随机播放列表中的位置。它会遍历所有壁纸,然后重新随机播放,重复播放,永无止境。
它将在每个周期或删除随机文件时拾取新文件。
接下来,我将把它和一些安装说明沿着放到GitHub上。
应用程序ts