我想为大量图像创建拇指。问题是,对于大型列表,读取行似乎非常慢。我能想到的一种解决方案是创建最多包含 500 行的文件,然后一一读取。但是这个问题有什么聪明的解决方案吗?
while read line; do
if [ -e "$line" ] && [ ! -z "$line" ]; then
...
fi
}
done <<< "$imagesList"
我想为大量图像创建拇指。问题是,对于大型列表,读取行似乎非常慢。我能想到的一种解决方案是创建最多包含 500 行的文件,然后一一读取。但是这个问题有什么聪明的解决方案吗?
while read line; do
if [ -e "$line" ] && [ ! -z "$line" ]; then
...
fi
}
done <<< "$imagesList"
您的问题是您正在使用 HERE 字符串通过<<<
. 如果 HERE 字符串非常大,这将很慢。
如果$imgageList
是一个文件,你可以做一个文件重定向,这会快很多:
while read line
do
if [ -e "$line" -a ! -z "$line" ]
then
...
fi
done < "$imagesList_file" # Redirect from a file.
您也许可以这样做:
echo "$imagesList" | while read line
do
if [ -e "$line" -a ! -z "$line" ]
then
...
fi
done
但是,我会担心命令行超载。在 Linux/Unix 系统中,这是在/usr/include/sys/syslimits.h
or中定义的/usr/include/syslimits.h
。在我的系统上是 1024 * 256 或 262,144 字节。这听起来很多,但可能具有欺骗性。文件名可能很长——尤其是如果您在其中包含目录路径。这通常足够长,可以在您进行测试时通过,但在您真的非常依赖它来工作时会失败。和。它默默地失败了。你永远不知道最后几个文件名被删除了。
最好的办法是使用图像名称列表创建一个文件,而不是将它们加载到环境变量中。
让我们再试一次:
echo $imagelist | xargs --delimiter=\ --max-args=1 -i echo "Do something with {}"
--- 8< 第一版 --- 8< ---
尝试这样的事情:
for IMG in $imageList; do
echo "Do something with ${IMG}"
done
--- >8 第一版 --- >8 ---