Shell脚本改变桌面壁纸

fdx2calv  于 2023-02-16  发布在  Shell
关注(0)|答案(7)|浏览(208)

你能写一个最简单的shell脚本来定期(比如1分钟)改变桌面壁纸吗?
壁纸将被保存在特定的目录(如$HOME/wallpapers)。我只需要基本的功能。
1)从$HOME/wallpapers选择随机壁纸
2)设置为桌面壁纸
3)将cron设置为每分钟运行一次脚本(不是问题的一部分)。

qcbq4gxm

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
eqzww0vc

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
cu6pst1q

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
kognpnkq

kognpnkq4#

在更新的Ubuntu中试试这个:gsettings set org.gnome.desktop.background picture-uri file:///path/to/img.jpg(尖端来自here

hgncfbus

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))

希望对有我同样问题的人有帮助!

mv1qrgav

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"
5jdjgkvh

5jdjgkvh7#

不幸的是,random函数本身并不能解决这个问题。
我刚刚启动了一个随机壁纸应用程序,这是我根据自己的直觉制作的,60秒后我就可以看出我的应用程序确实提供了随机性,而Ubuntu的一个主要受信任的应用程序... Variety...完全不是。
您是否注意到,random的壁纸或音乐播放列表(Shuffle)功能似乎有一个收藏夹的子集,它严重倾向于??更糟糕的是,每当这些应用程序重新启动时,它们完全忘记了之前的Shuffle以及它们在该列表中的位置,所以它们只是重新开始,再次挑选相同的收藏夹,从来没有得到随机函数的“不喜欢的”。智商145或声誉200 k的人会告诉我,我疯了,但我现在看到的壁纸,我已经几个月没有看到。我认为这与钟形曲线,启发式等。在钟形曲线边缘的选择很少被选中,而在中间的选择经常被选中,它更有可能选择0.3-0.7之间的数字,而不是0-0.3和0.7-1的总和,即使这个范围更大
所以我编写了一个应用程序,强制它真正地对文件进行随机播放,并在每次随机播放中包含所有壁纸。然后记住应用程序重启时的随机播放,并记住它在随机播放列表中的位置。它会遍历所有壁纸,然后重新随机播放,重复播放,永无止境。
它将在每个周期或删除随机文件时拾取新文件。
接下来,我将把它和一些安装说明沿着放到GitHub上。

应用程序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()

相关问题