'发现'命令行为与* .jpg文件行为不端?

时间:2017-08-21 18:10:01

标签: bash macos quoting glob

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

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

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

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

子文件夹中有很多.jpg文件。发生了什么事?

感谢。

更新: 我删除了那个单独的.jpg文件然后命令工作并找到了其余的。真的吗?刚刚发生了什么?

4 个答案:

答案 0 :(得分:1)

  

真的?刚刚发生了什么?

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

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

echo *.jpg

扩展为:

echo foo.jpg bar.jpg

你会看到输出:

foo.jpg bar.jpg

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

*.jpg

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

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

echo "*.jpg"

您将看到输出:

*.jpg

答案 1 :(得分:1)

使用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似乎行为不同)。

如果用引号括起*.jpg,就像Daniel建议的那样,表达式不会被扩展/“全局化”。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

只需检查扩展程序是.jpg还是.JPG!很多时候我们忽略了扩展中的资本案例。

最好的办法是尝试忽略大小写并将 <!DOCTYPE html> <html> <head> <meta charset = "UTF-8"> <meta http-equiv = "X-UA-Compatible" content = "IE = edge,chrome = 1"> <title>Hello World using select2.js</title> <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css" rel="stylesheet" /> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js"></script> </head> <body> <select multiple id="e1" class="js-example-basic-multiple js-states form-control"> <option value="AL">Alabama</option> <option value="Am">Amalapuram</option> <option value="An">Anakapalli</option> <option value="Ak">Akkayapalem</option> <option value="WY">Wyoming</option> </select> </body> <script> $(document).ready(function () { $(".js-example-basic-multiple").select2(); }); </script> </html> 放在双引号

*.jpg