我正在尝试编写一个别名来列出以 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
,但与ksh93
orzsh
不具有用于使单个 glob 或单个 glob 的一部分不区分大小写的 glob 运算符相反。
但是,您始终可以这样做:
ls -ld -- *.[jJ][pP][gG]
这还有一个好处,就是不让语言环境来决定给定字母的小写或大写变体是什么(例如,是gif
GIF
or的大写变体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)