玩转 Shell - 在 Apache 中显示图像目录
大多数时候,我编写 shell 脚本是为了解决我认为的轻量级问题。 是的,我承认,如果您需要预测天气、绘制 50,000 个数据点的地理地图或创建在线购物车,那么 shell 脚本可能不是最佳工具!
尽管如此,当我在日常工作中遇到问题或简化机会时,第一个拿出来的工具就是 shell 脚本。 对于你们中的一些人来说,它可能是 Perl 或一些花哨的 PHP 编码,但因为任何可以在 Linux 命令行上键入命令的人都准备好开始编写脚本,所以我不得不说我仍然相信 shell 脚本是一个很好的起点。
令人惊讶的是,您可以在短时间内完成多少工作,这个月我分享一个我拼凑起来的脚本,以解决您的 Web 服务器上可能存在的常见问题——一个巨大的“Images”目录。
坦率地说,Apache 和其他 Web 服务器生成的目录列表很糟糕。 它们基本上就是ls -l没有其他信息、没有预览,什么都没有。 大多数时候,这并不重要,因为您的大部分站点可能是无缝的,并且人们不会接触到后端。
但是,您可能收集站点上所有图像、图形和照片的目录很可能是一个不同的故事。 无论它被称为“Images”、“Graphics”、“Photos”、“Art”还是其他名称,您的目录很可能像我自己的目录一样:1,400 个图形文件。
如果文件名具有高度助记性,那么基于文本的列表功能会很有用,但是,如果同时显示所有图像的缩略图及其名称,而不是仅显示文件大小和上次修改日期,岂不是更有用?
这就是这个脚本的作用,并且像所有作为 CGI 脚本工作的脚本一样,它必须立即推送适当的标头信息才能开始
#!/bin/sh echo "Content-type: text/html" echo ""
既然已经解决了这个问题,剩下的内容就可以在一个循环中生成了。 事实上,脚本的第一个骨架版本只是复制了 Web 服务器中已有的文件列表功能
for name in * do echo "$name <br>" done
当然,这个输出并不是那么有趣。 至少,我们可以更改它,以便文件名是可点击的
echo "<a href=$name>$name</a><br>"
但是,即使这样也不是特别有趣。 让我们添加一些条件代码,以便显示图像,而其他所有内容都只是一个链接。 与其测试文件名,不如做一些更有趣的事情,并使用不为人知的命令 file。
当针对典型图像目录的内容运行时,这是您可以期望的输出类型
$ file * aol-safety-menu.png: PNG image data, 161 x 230, 8-bit/color RGB, non-interlaced apple-ipod-enter-code.png: PNG image data, 268 x 202, 8-bit/color RGB, non-interlaced archos-av700.png: PNG image data, 567 x 294, 8-bit/color RGB, non-interlaced empty.jpg: empty hentai-manga-example.gif: GIF image data, version 89a, 358 x 313, index.cgi: Bourne shell script text executable teamgeist.jpg: JPEG image data, JFIF standard 1.02, aspect ratio, 100 x 100
不错的命令,对吧? 它包括图像的类型、尺寸、深度以及它可以确定的任何其他特征。
最重要的是,请注意“XX image data”始终与这些图像一起出现,无论它们是 PNG、JPG 还是 GIF 图像。 通过使用它,我们可以避免 JPG 与 JPEG、JPG 与 jpg、Gif 与 GIF 等等的所有麻烦。
现在,这个小循环看起来像这样
for name in * do if [ ! -z "$(file $name | grep 'image data')" ] ; then echo "$name <br>" fi done
这足以自动跳过不是图像的文件,甚至是空的 empty.jpg,这是一个零字节的文件
$ sh index.cgi Content-type: text/html aol-safety-menu.png <br> apple-ipod-enter-code.png <br> archos-av700.png <br> hentai-manga-example.gif <br> teamgeist.jpg <br>
最后,我们取得了一些进展,因为现在我们可以区分实际是图像的文件和属于其他类型数据的文件。
在结束之前进行最后一次改进:与其仅将链接显示为可点击,不如为非图像实际输出可点击的链接,并使图像本身可点击。 这可以按如下方式完成
for name in * do if [ ! -z "$(file $name | grep 'image data')" ] ; then echo "<a href=$name><img " echo "src=$name></a><br>$name<hr>" else echo "<a href=$name>$name</a><hr>" fi done
如果图像不是太大,这开始看起来非常不错,正如您在图 1 中看到的那样。但是,如果它们是大图像,效果就不是很好。 因此,下个月我将向您展示此脚本的一些改进,包括我们如何在行上显示多个图像。
Dave Taylor 是一位拥有 26 年经验的 UNIX 老将,The Elm Mail System 的创建者,也是最近畅销书 Wicked Cool Shell Scripts 和 Teach Yourself Unix in 24 Hours 的作者,他还撰写了 16 本技术书籍。 他的主要网站是 www.intuitive.com。