在 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 文件,这可能没有多大意义。
- 如果没有找到符合任一模式的文件,则会显示错误消息。