2013-04-20 50 views
2

我有这个庆典“为”环,看起来对PDF文件的目录,并促使他们(简化的例子)猛砸了,当没有文件发现

#!/bin/bash 
for pic in "$INPUT"/*.pdf 
do 
    echo "found: ${pic}" 
done 

这个脚本作品执行错误以及当有$输入目录中的PDF文件,但是,当有目录中没有的PDF文件,我得到:

发现:/home/.../input-folder/*.pdf

是否是预期的行为? 我该如何处理for for循环? 我是否需要使用ls或找到?

我试着用“$ INPUT”左右引号。文件名称和目录名称中没有空格。

非常感谢您的意见。

+0

参见[枚举文件或做的东西与文件](http://mywiki.wooledge.org/ParsingLs#Enumerating_files_or_doing_stuff_with_files)。 – 2013-04-20 08:43:49

回答

6

这是预期的行为。按照bash man page,在路径名扩展部分:

字分开后,除非-f选项已被设置时,bash搜索每个字的字符*,和[?如果出现这些字符中的一个,则将该字视为模式,并用符合该模式的按字母顺序排列的文件名列表替换。 如果找不到匹配的文件名,并且shell选项nullglob未启用,则该字保持不变。

因此,如果找不到"$INPUT"/*.pdf的匹配项,循环将在模式本身上执行。但是在手册页的下一句中:

如果设置了nullglob选项,并且找不到匹配项,则会删除该词。

这就是你想要的!所以只是做:

#!/bin/bash 
shopt -s nullglob 
for pic in "$INPUT"/*.pdf 
do 
    echo "found: ${pic}" 
done 

(但要注意,这可能会改变在意想不到的方式与其他事物的行为,例如,尝试运行shopt -s nullglob; ls *.unmatchedextension看看会发生什么。)

1

我只想补充文件存在的测试是这样的:

#!/bin/bash 
if test -e `echo "$INPUT"/*.pdf | cut -d' ' -f1` 
then 
    for pic in "$INPUT"/*.pdf 
    do 
     echo "found: ${pic}" 
    done 
fi 
+0

如果'“$ INPUT”/ *。pdf'匹配多个文件(参数太多),'test'命令可能会失败。 – chepner 2013-04-21 01:57:13

+0

你是对的 - 回答更正 – parkydr 2013-04-21 07:48:47

+0

更接近,但如果产生的第一个文件名包含一个空格,'test'仍然可能失败; 'cut'将输出一个部分路径,而不是整个路径。 – chepner 2013-04-22 12:39:20