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

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

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

我想 :

for i in (`ls *.PNG` && `ls *.png`)

但出现语法错误。

答案1

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

for i in *.[Pp][Nn][Gg]; do

或者

shopt -s nocaseglob
for i in *.png; do

尽管那将使你脚本的所有 shell glob(即通配符文件匹配)不区分大小写,直到你运行shopt -u nocaseglob

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

shopt -s nullglob
for i in *.png *.PNG; do

或者

for i in *.png *.PNG; do
    [[ -e "$i" ]] || continue

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

答案2

你也可以尝试一些单行代码,例如

查找。-iname“*.png”-exec....

或者

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

编辑
另请参阅下面@Yab 关于递归的评论。

答案3

ls在这里几乎没用,但根据记录,这里有一个更接近您尝试的语法:

for i in $(ls *.PNG ; ls *.png)

笔记:

  • 我假设您想要大写和小写的图片。&& 分隔符意味着仅当 PNG 文件存在时才处理 png 文件,这可能没有多大意义。
  • 如果没有找到符合任一模式的文件,则会显示错误消息。

相关内容