虽然读取线很慢

时间:2013-09-24 23:21:57

标签: linux bash loops while-loop

我想为大量图片创建大拇指。 问题是,看起来虽然大型列表的读取行很慢。我能想到的一个解决方案是创建包含最多500行的文件,然后逐个读取它们。但这个问题是否有任何智能解决方案?

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

2 个答案:

答案 0 :(得分: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.h/usr/include/syslimits.h中定义的。它在我的系统上是1024 * 256或262,144字节。这听起来很多,但可能具有欺骗性。文件名可能很长 - 特别是如果您在其中包含目录路径。这通常足够长,以便在您进行测试时通过,但是当您确实真正依赖它工作时会失败。和。它无声地失败了。你永远不会知道最后几个文件名已被删除。

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

答案 1 :(得分:-1)

让我们再试一次:

echo $imagelist | xargs --delimiter=\  --max-args=1 -i echo "Do something with {}"

--- 8&lt;第一版--- 8&lt; ---

尝试这样的事情:

for IMG in $imageList; do
    echo "Do something with ${IMG}"
done

---&gt; 8第一版---&gt; 8 ---