bash:文件名中的空格

时间:2012-09-18 14:00:05

标签: bash

我有一个简单的脚本:

#!/bin/sh
cd /tmp/pics
for pic in *.jpg;
do
  php -f /tmp/pics/covert.php $pic;
done

当我的图片名称中有空格时,脚本将无效。我怎么能解决这个问题?

如何修复我的脚本以正确处理空白,还可以处理其他JPEG扩展,例如“JPG”,“JPEG”,“jpeg”?

3 个答案:

答案 0 :(得分:2)

bash和其他shell中的引用规则与Ruby,Python和Perl等“普通”脚本语言中的引用规则不同,所以这可能会让人感到困惑,但如果你在$pic周围加上双引号,bash会正确处理变量的内容,即使它包含空格。

这一个修复程序会使您的脚本看起来像这样

#!/bin/sh
cd /tmp/pics
for pic in *.jpg;
do
  php -f /tmp/pics/covert.php "$pic";
done

我还会删除每行末尾的分号。只有当你在一条线上塞满多条线时才需要这些。他们不像在PHP或(在较小程度上)JavaScript那样以bash的方式使用它们。

如上所述,这是使用Bourne shell而不是bash。 (目前我们将忽略可能在您的系统上使用bash来模拟Bourne shell的事实。)如果您想使用bash,请更改顶部的“shebang”行。通常是#!/bin/bash

要处理多个文件扩展名,您可以将它们彼此相邻堆叠,中间有空格,例如

for pic in *.jpg *.jpeg *.JPEG *.JPG

正如Jens指出的那样,你可能会遇到奇怪的角落案例,其中文件扩展名是混合大小写的。您可以使用括号来处理该字符组

for pic in *.[jJ][pP][gG] *.[jJ][pP][eE][gG]

或者您可以使用glenn设置shell选项的方法来忽略大小写(和non-matching patterns),然后使用更简单的glob模式

shopt -s nocaseglob nullglob
for pic in *.jpg *.jpeg

如果采用后一种方法,最终的脚本将如下所示:

#!/bin/bash
cd /tmp/pics
shopt -s nocaseglob nullglob
for pic in *.jpg *.jpeg
do
  php -f /tmp/pics/covert.php "$pic"
done

希望这有帮助!

答案 1 :(得分:2)

对于像这样的简短脚本,我会使用

#!/bin/sh
cd /tmp/pics
for pic in *.[jJ][pP][gG] *.[jJ][pP][eE][gG]; do
  php -f /tmp/pics/covert.php "$pic"
done

这甚至可以处理奇怪的类似扩展,例如prettygirl.JpeG: - )

答案 2 :(得分:2)

使用bash,进行不区分大小写的文件匹配:

shopt -s nocaseglob nullglob
for pic in *{jpg,jpeg}
do
    php5 -f ./convert.php "$pic"
done