16

我正在尝试在 bash 中编写一个 for 循环来获取扩展名为 jpg、jpeg、png 的文件,这是我的尝试,但不起作用

for file in "${arg}"/*.{jpg,jpeg,png}; do echo ${arg}-something.jpg > z.txt ; done;

基本上,我想在当前文件夹中获取具有这些扩展名的文件的名称,并对每个文件执行一些操作,然后使用新的扩展名输出文件名。

4

2 回答 2

32

您没有$file在任何地方使用。尝试

for file in "$arg"/*.{jpg,jpeg,png} ; do
    echo "$file" > z.txt
done
于 2012-09-04T08:17:46.457 回答
24

我想建议对提议的解决方案进行 2 项改进:

A. "$arg"/ .{jpg,jpeg,png} 中的 for 文件也将产生 "$arg"/ .jpeg 如果没有带有 jpeg 扩展名的文件并且会产生脚本错误:

$ echo *.{jpg,jpeg,png}
myPhoto.jpg *.jpeg *.png

为了避免这种情况,就在 for 循环之前,将 nullglob 设置为从列表中删除 null glob:

$ shopt -s nullglob # Sets nullglob
$ echo *.{jpg,jpeg,png}
myPhoto.jpg
$ shopt -u nullglob # Unsets nullglob

B. 如果你还想搜索 *.png 或 *.PNG 或 *.PnG (即忽略大小写),那么你需要设置 nocaseglob:

$ shopt -s nullglob # Sets nullglob
$ shopt -s nocaseglob # Sets nocaseglob
$ echo *.{jpg,jpeg,png}
myPhoto.jpg myPhoto.PnG
$ shopt -u nocaseglob # Unsets nocaseglob
$ shopt -u nullglob # Unsets nullglob
于 2016-12-14T09:49:15.210 回答