Bash shell:列出 .png 或 .PNG 类型的所有文件?

sim*_*mon 14 bash shell shell-script

在 bash 脚本中,我如何说“对于 .png 或 .PNG 类型的所有文件”?

我想 :

for i in (`ls *.PNG` && `ls *.png`)
Run Code Online (Sandbox Code Playgroud)

但是出现语法错误。

Gor*_*son 18

如果您想要所有可能的组合,请使用:

for i in *.[Pp][Nn][Gg]; do
Run Code Online (Sandbox Code Playgroud)

或者

shopt -s nocaseglob
for i in *.png; do
Run Code Online (Sandbox Code Playgroud)

尽管在您运行shopt -u nocaseglob.

如果你真的只想要 .PNG 和 .png(而不是,例如,.PnG 或 .pnG),那么使用

shopt -s nullglob
for i in *.png *.PNG; do
Run Code Online (Sandbox Code Playgroud)

或者

for i in *.png *.PNG; do
    [[ -e "$i" ]] || continue
Run Code Online (Sandbox Code Playgroud)

... nullglob 或存在性检查的原因是,如果您只有小写或大写扩展名,它将在文件列表中包含不匹配的模式,从而导致循环体中的错误。与 nocaseglob 一样,您可能希望之后关闭 nullglob shell 选项(尽管根据我的经验,打开 nullglob 通常是好的,尤其是在脚本中)。实际上,我认为对所有这样的文件匹配使用 nocaseglob 或存在检查是个好主意,以防万一没有匹配。

  • `for i in *.{png,PNG}` (5认同)

Ala*_*ier 5

您也可以尝试一些单线,例如

找 。-iname "*.png" -exec ....

或者

找 。-iname "*.png" | xargs ....

编辑
另见@Yab关于递归的评论。