zsh 中是否存在特定文件和文件类型的条件测试

1 shell zsh shell-script wildcards

我要检查当前目录下的文件是否存在与扩展abcbak或者tmp或者指定的文件tmpout.wrk。我无法在 zsh 中使用它(最终是函数的一部分)。它运行,但未能正确检测。

if [[ -f *.(abc|bak|tmp) || -f tmpout.wrk ]]; then 
    echo 'true'; 
else 
    echo 'false'; 
fi
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 5

要测试 glob 是否至少返回一个文件,您可以执行以下操作:

if ()(($#)) (*.(abc|bak|tmp)|tmpout.wrk)(NY1); then
  echo true
else
  echo false
fi
Run Code Online (Sandbox Code Playgroud)

要在符号链接解析后检查其中至少一个是常规文件,请添加-. glob 限定符:

if ()(($#)) (*.(abc|bak|tmp)|tmpout.wrk)(NY1); then
  echo true
else
  echo false
fi
Run Code Online (Sandbox Code Playgroud)
  • ()(($#))是一个匿名函数,我们将 globs 的结果传递给它。该函数 ( (($#)))的主体只是测试非零参数的数量。

  • N当 glob 限定符nullglob为该 glob打开时(当它不匹配任何文件时,使 glob 扩展为空)

  • Y1将扩展限制为最多一个文件。这是性能优化。

  • -符号链接解析考虑下一个 glob 限定符。

  • .仅考虑常规文件(因此这里的常规文件或符号链接最终会解析为常规文件,就像[ -f file ]命令一样)。