【问题标题】:'find' command misbehaving with *.jpg files?'find' 命令对 *.jpg 文件行为不端?
【发布时间】:2017-08-21 18:10:01
【问题描述】:

如果我发出这个 find 命令,它只会显示指定目录中的内容:

find /Users/me/Pictures -name *.jpg

但如果我发出这个,它会遍历子文件夹并向我显示所有 .NEF 文件:

find /Users/me/Pictures -name *.NEF

子文件夹中有很多 .jpg 文件。怎么回事?

谢谢。

更新: 我删除了那个 .jpg 文件,然后该命令起作用并找到了其余文件。严重地?刚刚发生了什么?

【问题讨论】:

  • 试试-name '*.jpg'。

标签: bash macos quoting glob


【解决方案1】:

真的吗?刚刚发生了什么?

您刚刚了解了 shell 通配符扩展。

当您在命令行中输入不带引号的通配符 (*) 时,在命令行执行之前 由 shell 扩展。因此,如果您的本地目录中有一个名为 foo.jpg 和 bar.jpg 的文件,那么:

echo *.jpg

扩展为:

echo foo.jpg bar.jpg

你会看到输出:

foo.jpg bar.jpg

但是如果你有没有匹配的文件,那么命令行会逐字运行,你会看到输出:

*.jpg

这正是您的find 命令所发生的情况。在当前目录中有一个 .jpg,*.jpg 扩展为文件名。删除文件后,*.jpg 表达式将被保留并传递给 find 命令。

如 cmets 中所示,解决方案是引用您的参数以查找 find 命令以禁止 shell 通配符扩展。即使您的目录中有文件foo.jpg 和bar.jpg,如果您运行:

echo "*.jpg"

你会看到输出:

*.jpg

【讨论】:

    【解决方案2】:

    find /Users/me/Pictures -name *.jpg 的情况是,shell (Bash) 在命令执行之前扩展了*.jpg。因此,如果您有这样的文件夹:

    $ ls
    1.jpg  2.jpg  3.jpg  dir1  dir2  dir3
    

    shell 通过应用正则表达式扩展*.jpg。因此,之后将发出到提示符的命令将是find /Users/me/Pictures -name 1.jpg 2.jpg 3.jpg。 (这个命令在 Linux 上对我来说实际上是失败的,所以 macOS 似乎表现不同)。

    如果像 Daniel 建议的那样用引号将 *.jpg 括起来,则表达式将不会被扩展/“globbed”。

    【讨论】:

      【解决方案3】:

      尝试在表达式中使用双引号,让我们知道它是怎么回事。

      find /Users/me/Pictures -name "*.NEF"
      OR
      find /Users/me/Pictures -name "*.jpg"
      

      【讨论】:

        【解决方案4】:

        只需检查扩展名是 .jpg 还是 .JPG!很多时候我们在扩展中忽略了大写。

        最好的办法是尝试忽略大小写并将*.jpg 放在双引号中

        find ./ -iname "*.jpg"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-03
          • 2018-04-14
          • 1970-01-01
          • 2011-05-26
          • 1970-01-01
          相关资源
          最近更新 更多