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[@]}"
我没有使用 find
和 grep
,而是使用了 bash
globbing,这对于带空格的文件名是安全的,并且还可以节省您 运行宁另外两个命令!这需要 bash 4+ 用于提供递归匹配的 globstar 选项。
globbing 为您提供数组中的文件名,该数组直接传递给 fbi
,如 Bash FAQ 50
中所述
我正在使用 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[@]}"
我没有使用 find
和 grep
,而是使用了 bash
globbing,这对于带空格的文件名是安全的,并且还可以节省您 运行宁另外两个命令!这需要 bash 4+ 用于提供递归匹配的 globstar 选项。
globbing 为您提供数组中的文件名,该数组直接传递给 fbi
,如 Bash FAQ 50