【问题标题】:Bash script for a slideshow with image list refresh带有图像列表刷新的幻灯片的 Bash 脚本
【发布时间】:2016-05-22 02:39:25
【问题描述】:

我正在使用fbi 为幻灯片编写一个简短的脚本。为了完整起见,脚本在 Ubuntu 机器上自动登录后执行,该机器应该无头运行;机器唯一的外部接口应该是我添加/删除图像的 Samba 文件夹。 我开始很容易:

usr/bin/fbi -noverbose -a -t 4 -u `find -type f | egrep -i "(jpg|bmp|png|gif)$"`

这很好用:find/egrep 返回fbi 以 4 秒间隔显示的文件列表。 现在,当添加新图像或删除现有图像时,我需要刷新我的幻灯片列表。我试过watch,没有成功。

如果我从命令行执行这个:

watch -n 300 -t `find -type f | egrep -i "(jpg|bmp|png|gif)$"`

我得到相同的文件列表,每当我将图像添加到目标文件夹时,列表会在接下来的 5 分钟内更新。美好的。但是当我将它添加到我的脚本中时,没有任何效果:

/usr/bin/fbi -noverbose -a -t 4 -u `watch -n 300 -t 'find -type f | egrep -i "(jpg|bmp|png|gif)$"'`

有了这个,我什么也得不到,当我中断幻灯片时,我的命令行被搞砸了(没有回车,没有打字回声......)。

我做错了什么/忽略/错过了什么?还是我完全偏离了目标?

因为另一种解决方案是有两个脚本,幻灯片的一个和一个控制器脚本(可能使用 inotify-tools),当目标文件夹被修改时终止并重新启动幻灯片脚本。

任何建议或提示,非常感谢!

皮疹*

【问题讨论】:

  • watch 看起来不太适合脚本,我认为您应该使用while 循环和sleep 命令
  • @golimar:是的,谢谢,一位朋友已经警告我手表不适合脚本...我真的是一个 bash 新手...

标签: bash shell slideshow watch inotify


【解决方案1】:
watch -n 300 -t `find -type f | egrep -i "(jpg|bmp|png|gif)$"`

这是在做什么,因为您使用了反引号,将文件名列表传递给watch,我怀疑您不想这样做。 也许这会起作用,但我没有任何方法可以测试:

watch -n 300 -t '/usr/bin/fbi -noverbose -a -t 4 -u `find -type f | egrep -i "(jpg|bmp|png|gif)$"`'

尽管这带来了一个棘手的问题,即几天后fbi 将运行多少副本。

您最好的选择可能是设置一个 cron 作业以每 x 分钟运行一次这样的脚本:

#!/bin/bash
pkill -f /usr/bin/fbi
shopt globstar
cd /your/images/directory
files=(**/*.jpg **/*.bmp **/*.png **/*.gif)
usr/bin/fbi -noverbose -a -t 4 -u "${files[@]}"

我没有使用findgrep,而是使用了bashglobbing,这对于带有空格的文件名是安全的,并且还可以节省您运行其他两个命令的时间!对于提供递归匹配的 globstar 选项,这需要 bash 4+。

globbing 为您提供数组中的文件名,该数组直接传递给fbi,如Bash FAQ 50 中所述

【讨论】:

  • 非常感谢!我选择了你的答案,因为不仅解决了我的问题,而且还预见到了一些额外的问题(比如:我还没有解决类似 win 的文件名的问题,globstar 很好地解决了这个问题,所以我也学到了还有一件事……)。再次感谢!
  • 我想发布我的最终解决方案,它从您的回答开始并以此为基础,解决了一个令人讨厌的问题(至少对我来说很讨厌)。正确的做法是什么?
  • 你可以编辑我的问题来添加你的东西,如果它太长而不适合 cmets。
猜你喜欢
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 2012-02-27
  • 2017-09-06
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
  • 1970-01-01
相关资源
最近更新 更多