如何检查 glob 模式是否返回任何内容

如何检查 glob 模式是否返回任何内容

如何检查是否/var/some-dir/*返回任何东西?

我使用find /var/some-dir/* ...,但如果模式为空,我会收到错误。我不想重定向stderr

我想在执行之前检查find该模式是否会返回任何内容或错误

答案1

您应该能够处理返回值。

如果find以这种方式使用时什么也没找到,它会返回1,所以你可以这样做

find /var/some-dir/*
if [[ $? -eq 1 ]]
then
  perform_failure_action
fi

如果您想事先检查一下,您可以尝试以下操作:

shopt -s nullglob
f=/var/some-dir/*
if [ -z $f ]
then
  printf -- "No such file!\n"
else
   find /var/some-dir/*
fi

shopt行将确保如果没有文件与 glob 模式匹配,它将扩展为空字符串,然后可以通过-z.

在这种情况下,请确保不是引用$f你的该测试中的全局扩展。出于同样的原因,您必须使用单括号测试运算符,不是双括号运算符,可以为被测变量实现自己的“保护”方案。

或者,如果您使用支持它的 shell(例如 Bash),则可以使用compgen带有该-G选项的内置命令。这将生成提供给它的 glob 模式 ( ) 的补全列表,并且如果存在匹配则-G返回:true

if compgen -G /var/some-dir/*
then
  find /var/some-dir/*
else
  printf -- "No such file!\n"
fi

相关内容