0

我想为大量图像创建拇指。问题是,对于大型列表,读取行似乎非常慢。我能想到的一种解决方案是创建最多包含 500 行的文件,然后一一读取。但是这个问题有什么聪明的解决方案吗?

while read line; do
  if [ -e "$line" ] && [ ! -z "$line" ]; then
              ...
  fi
}
done <<< "$imagesList"
4

2 回答 2

1

您的问题是您正在使用 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.hor中定义的/usr/include/syslimits.h。在我的系统上是 1024 * 256 或 262,144 字节。这听起来很多,但可能具有欺骗性。文件名可能很长——尤其是如果您在其中包含目录路径。这通常足够长,可以在您进行测试时通过,但在您真的非常依赖它来工作时会失败。和。它默默地失败了。你永远不知道最后几个文件名被删除了。

最好的办法是使用图像名称列表创建一个文件,而不是将它们加载到环境变量中。

于 2013-09-25T00:57:13.570 回答
-1

让我们再试一次:

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 ---

于 2013-09-24T23:59:53.720 回答