Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 而读线非常慢_Linux_Bash_Loops_While Loop - Fatal编程技术网

Linux 而读线非常慢

Linux 而读线非常慢,linux,bash,loops,while-loop,Linux,Bash,Loops,While Loop,我想为大量图像创建拇指。 问题是,虽然读取行速度很慢,但列表很大。我能想到的一个解决方案是创建最多包含500行的文件,然后逐个读取它们。但是对于这个问题有什么明智的解决方案吗 while read line; do if [ -e "$line" ] && [ ! -z "$line" ]; then ... fi } done <<< "$imagesList" 读行时;做 如果[-e“$line”]&&&[!-z“$li

我想为大量图像创建拇指。 问题是,虽然读取行速度很慢,但列表很大。我能想到的一个解决方案是创建最多包含500行的文件,然后逐个读取它们。但是对于这个问题有什么明智的解决方案吗

while read line; do
  if [ -e "$line" ] && [ ! -z "$line" ]; then
              ...
  fi
}
done <<< "$imagesList"
读行时
;做
如果[-e“$line”]&&&[!-z“$line”];然后
...
fi
}
完成让我们再试一次:

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

您的问题是,您正在通过
使用一个HERE字符串来读取这些行,可能使用比bash更适合这些任务的东西?此外,您从哪里获得
$imagesList
以及为什么要将它与
一起传递?我高度怀疑这里的慢之处是读取这些行。您正在为每个文件创建缩略图?这就是慢的部分。我的直觉是慢的部分是从
find
命令构建长的ass字符串,然后再次将其拆分为行。做
find…|(阅读line;do;…;done)
相反。无意冒犯,但此评论帖子充满了货物崇拜,从问题中看不到足够的证据来确认或否认任何方法。最有可能的是
find…-exec something{}+
比任何涉及
while循环的方法都更合适,但如果问题中没有更多信息,就不可能写出答案。如果
$imageList
与OP所说的一样大,这将非常缓慢,并且可能会使命令行过载,这意味着最后的条目不会被执行。过载命令行上的什么?ARG_MAX是传递给
exec
的缓冲区的最大长度,如果可以避免子shell,则不会影响纯bash解决方案。如果您确实创建了子shell,我认为读取时
echo |
的速度非常令人怀疑,因为您还得到了
PIPE\u BUF
限制PIPE的缓冲区大小。ARG\u MAX也是命令行中可以容纳的最大长度——一旦命令行被扩展。shell展开命令行并将其传递给命令行。如果
$imagesList
很大,则可能太大而无法传递给正在执行的命令。管道不是一个限制因素。事实上,在我的系统上,它只有512字节。PIPE_BUF用于保存第一个命令的标准输出到第二个命令的标准输入的数据(如果第二个命令尚未准备就绪)。我当然可以通过管道传递超过512个字节。我不是说
pipe\u BUF
限制了数量,只是限制了速度。但让我们忽略这一点。这里更关键的是,
ARG_MAX
是仅当shell通过
exec
调用某些内容时,命令行中可以容纳的最大长度。如果shell正在调用一个内置的,比如在循环中,
ARG\u MAX
不适用。就像这里的情况一样。
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