如果文件名glob没有匹配,如何匹配任何内容

时间:2015-04-03 18:53:05

标签: bash glob

我想循环遍历所有与扩展程序jpgtxt匹配的文件。我用:

for file in myDir/*.{jpg,txt}
do
  echo "$file"
done

问题:如果目录根本不包含jpg文件,则循环将进行一次输出myDir/*.jpg的迭代。我以为*将被任意文件替换(如果不存在文件,则无法展开)。如何避免不必要的迭代?

2 个答案:

答案 0 :(得分:17)

使用它来避免不必要的迭代:

shopt -s nullglob

来自man bash

  

nullglob:如果设置,bash允许不匹配任何文件的模式(请参阅上面的Pathname Expansion)扩展为空字符串,而不是自己。

请参阅:help shoptshopt

答案 1 :(得分:0)

这个问题和重复的问题不仅与路径名扩展有关,还与括号扩展有关,并且重复项要求提供POSIX。

compgen -G进行bash --posix兼容的路径名扩展(不带花括号扩展),并且...您猜对了:如果没有匹配项,则不会产生任何结果。

因此,编写一个bash --posix函数即可。简要概述:临时使用set -f首先通过回显进行大括号扩展(不进行路径名扩展),然后将compgen -G应用于每个结果以进行路径名扩展。保留所有功能作为练习。