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


14

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

我正在努力 :

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

但出现语法错误。

Answers:


18

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

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

要么

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

尽管这会使您脚本的所有外壳程序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或存在性检查用于所有此类文件匹配是一个好主意,以防万一没有匹配项。


5
for i in *.{png,PNG}
格伦·杰克曼

@glenn:那也可以(相当于`* .png * .PNG),尽管您仍然需要nullglob或存在性检查。
戈登·戴维森

5

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

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

要么

找 。-iname“ * .png” | xargs ....

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


1
但是find默认情况下是递归的,因此要获得问题所要求的相同结果,您必须要做 find -maxdepth 1 -iname "*.png"
Yab

@Yab,您完全正确。我忽略了这方面。
阿兰·潘尼捷

1

ls 在这里几乎没有用,但是为了便于记录,这里的语法更接近您的尝试:

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

笔记:

  • 我假设您同时需要大写和小写图片。&&分隔符表示仅当存在PNG文件时才处理png文件,这可能没有多大意义。
  • 如果找不到任何一种模式的文件,则会显示错误消息。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.