for循环故障


10

我正在尝试设置一个脚本,该脚本将遍历一组目录,并在找到.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循环?

Answers:


17

这是正常现象,并且是默认行为:如果globlob无法匹配任何文件/目录,则将保留原始globlob字符。

如果要返回空结果,则可以nullglob在脚本中按以下方式设置选项:

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

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

$ shopt -u nullglob

6

find如果您正在运行的文件命令足够简单,只需一行即可使用,在这里稍微走一步,使用它可能也很有用。查找可以采用几种路径来查找,并且也会很高兴在子目录中找到任何文件。

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.