检查目录是否至少包含一种文件类型

问题描述 投票:0回答:2

我试图在运行代码之前检查目录是否至少包含一个 .JPG 文件。

[ -f *.JPG ] && echo "yes"

将导致以下错误:

bash: [: too many arguments
如果该目录中有这样的匹配文件。

如果目录中没有匹配的文件,则不会产生错误。

如果目录仅包含 .JPG 文件,则代码可以工作,但我需要一些可以在充满其他文件扩展名的目录中找到至少一个 .JPG 的东西。

提前非常感谢。

bash conditional-statements
2个回答
0
投票

感谢您描述案例。您遇到的问题来自 bash 测试实用程序的

-f
选项或标志的方式。官方文档指出“如果文件存在并且是常规文件,则为真。” - 实际上,如果存在与搜索模式匹配的单个常规文件,则为真。在您的情况下,如果您有多个 jpg 类型的文件,它将失败并出现 [: too many arguments
 错误,因此这就是它不适合您的原因。

您可以通过在终端中输入

man [

来查看文档,并将看到以下详细信息以供您进一步阅读:

enter image description here

解决方案

我想提醒您注意

-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,所以这就是为什么最好有这个并使用测试实用程序避免错误
希望这有帮助!


0
投票
此条件在

ls

 输出中查找 .JPG 结尾:

[ -n "$(ls | grep .JPG$)" ]
区分大小写。如果允许 .jpg 则:

[ -n "$(ls | grep -i .JPG$)" ]
    
© www.soinside.com 2019 - 2024. All rights reserved.