for 循环 glob 事故

Vin*_* W. 16 bash wildcards

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

my_dir="pictures/"
ext="JPG"
for f in "$my_dir"*."$ext"; do
    echo $f
done
Run Code Online (Sandbox Code Playgroud)

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

pictures/one.JPG
pictures/two.JPG
Run Code Online (Sandbox Code Playgroud)

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

pictures/*.JPG
Run Code Online (Sandbox Code Playgroud)

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

joe*_*epd 26

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

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

$ shopt -s nullglob
$ for f in "$my_dir"*."$ext"; do echo $f; done
$
Run Code Online (Sandbox Code Playgroud)

您可以在之后禁用它:

$ shopt -u nullglob
Run Code Online (Sandbox Code Playgroud)


ilk*_*chu 6

find如果您正在为文件运行的命令足够简单,可以放在一行上,那么稍微侧身一下,使用在这里也可能很有用。Find 可以采用多个路径进行查找,并且也会很高兴地找到子目录中的任何文件。

$ find foo/ bar/ -name "*.jpg" -exec echo {} \;
foo/ccc.jpg
foo/bbb.jpg
bar/aaa.jpg
Run Code Online (Sandbox Code Playgroud)

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