我试图在运行代码之前检查目录是否至少包含一个 .JPG 文件。
[ -f *.JPG ] && echo "yes"
将导致以下错误:
bash: [: too many arguments
如果该目录中有这样的匹配文件。
如果目录中没有匹配的文件,则不会产生错误。
如果目录仅包含 .JPG 文件,则代码可以工作,但我需要一些可以在充满其他文件扩展名的目录中找到至少一个 .JPG 的东西。
提前非常感谢。
感谢您描述案例。您遇到的问题来自 bash 测试实用程序的
-f
选项或标志的方式。官方文档指出“如果文件存在并且是常规文件,则为真。” - 实际上,如果存在与搜索模式匹配的单个常规文件,则为真。在您的情况下,如果您有多个 jpg 类型的文件,它将失败并出现 [: too many arguments
错误,因此这就是它不适合您的原因。您可以通过在终端中输入
man [
来查看文档,并将看到以下详细信息以供您进一步阅读:解决方案
-n
选项。如果字符串长度非零,它将返回“True。”。您可以做的是将其与标准
ls
命令结合起来,这是一个可行的解决方案:
[ -n "$(ls *.jpg 2>/dev/null)" ] && echo "yes" || echo "no"
详情-n
- 我们将使用的选项。如果字符串长度非零则返回 True
"$(ls *.jpg 2>/dev/null)"
- 解决方案的关键。列出当前文件夹中所有 jpg 类型的文件。它将与 1 个或多个文件一起使用。没有文件将返回错误。
2>/dev/null
- 将所有错误结果重定向到远离输出非常重要,这样当我们测试命令结果的长度时可以得到空结果。虽然在某些终端上它可以在没有此部分的情况下工作,但建议您拥有它,以便在发生错误时您可以完全控制。如果没有这个,错误输出也会通过 -n 选项返回 True,所以这就是为什么最好有这个并使用测试实用程序避免错误
ls
输出中查找 .JPG 结尾:
[ -n "$(ls | grep .JPG$)" ]
区分大小写。如果允许 .jpg 则:
[ -n "$(ls | grep -i .JPG$)" ]