for 循环 glob 事故

for 循环 glob 事故

我正在尝试设置一个脚本,该脚本将循环遍历一组目录,并在找到 .jpg 文件时执行一项操作,在找到 .nef 文件时执行另一项操作。问题是,如果目录没有 .jpg 文件(或 .nef),则 glob 条目不再是扩展的 glob,而只是一个字符串。例如:

my_dir="pictures/"
ext="JPG"
for f in "$my_dir"*."$ext"; do
    echo $f
done

如果 my_dir 文件夹中有 .JPG 文件,那么它们将在命令行上正确回显。

pictures/one.JPG
pictures/two.JPG

但是,如果 my_dir 没有 .JPG 文件,则循环将进入一次迭代并回显:

pictures/*.JPG

我该如何构造这个,以便如果 glob 没有匹配项,它就不会进入 for 循环?

答案1

这是正常的默认行为:如果通配符无法匹配任何文件/目录,则将保留原始通配符。

如果您想返回空结果,可以nullglob在脚本中设置该选项,如下所示:

$ shopt -s nullglob
$ for f in "$my_dir"*."$ext"; do echo $f; done
$

之后您可以通过以下方式禁用它:

$ shopt -u nullglob

答案2

稍微横向一点,find如果您为文件运行的命令足够简单,可以放在一行中,那么 using 在这里也可能很有用。查找可以采用多个路径进行查找,并且也很乐意在子目录中查找任何文件。

$ find foo/ bar/ -name "*.jpg" -exec echo {} \;
foo/ccc.jpg
foo/bbb.jpg
bar/aaa.jpg

(执行的命令在标志后面给出,以.-exec结尾,并被当前文件的名称替换。);{}

答案3

将此行添加到脚本的开头

shopt -s nullglob

相关内容