简短回答

简短回答

我正在尝试编写一个别名来列出以 JP(E)G 结尾的目录中各种形式的所有文件。我正在寻找它识别的是.jpg、.JPG、.jpeg 和.JPEG。

是否有 ls 的形式(或LS与另一个命令(例如 find 或 grep)结合使用可以做到这一点?

答案1

简短回答

不可以。但是ls没有办法列出文件结尾.jpg区分大小写或注释。 shell 将 转换*.jpg为文件列表,并将该列表传递给ls.尝试一下echo *.jpg,了解 shell 正在做什么。

长答案

您可以使用find:例如find . -iname "*.jpg" -o -iname "*.jpeg"

或使用 grep 例如ls | grep -iE "[.]jpe?g$"

或者将您的 shell 设置为不区分大小写的 glob:shopt -s nocaseglob(这在 Bash 中有效,请参阅如何将不区分大小写的模式与 ls 匹配?用于其他 shell 的解决方案。)

答案2

请注意,它不是ls扩展通配符,而是外壳。

bash可以使用该选项使其所有 glob 不区分大小写nocaseglob,但与ksh93orzsh不具有用于使单个 glob 或单个 glob 的一部分不区分大小写的 glob 运算符相反。

但是,您始终可以这样做:

ls -ld -- *.[jJ][pP][gG]

这还有一个好处,就是不让语言环境来决定给定字母的小写或大写变体是什么(例如,是gif GIFor的大写变体GİF吗?)。

或者extglob也可以选择涵盖jpeg

ls -ld -- *.[jJ][pP]?([eE)[gG]

使用zsh、 和选项extendedglob( set -o extendedglob):

ls -ld -- *.(#i)jp(e|)g

ksh93

ls -ld -- *.~(i)jp?(e)g

或者:

ls -ld -- *.~(i:jp?(e)g)

相关内容