Bash 带图像列表刷新的幻灯片脚本

Bash script for a slideshow with image list refresh

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

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

这很好用:find/egrep return 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)$"'`

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

我在做什么wrong/overlooking/missing?还是我完全偏离了目标?

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

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

皮疹*

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,而是使用了 bash globbing,这对于带空格的文件名是安全的,并且还可以节省您 运行宁另外两个命令!这需要 bash 4+ 用于提供递归匹配的 globstar 选项。

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

中所述