当KSH中的参数太多时,迭代参数列表

时间:2012-05-14 08:46:58

标签: shell parameters ksh

有时我必须遍历目录中的所有文件才能找到一些东西,而通常for i in $(ls *.txt)通常会起作用。但有些情况下,文件夹中的文件太多而for会产生0403-027 The parameter list is too long.(即fordiffls或其他任何内容

我已经找到了一个解决方案就是用while read逐行读取输入,但接下来是棘手的部分。起初,我认为理想会是这样的:

while read file ; do
    # do something with file
done < $(find . -type f -name *.txt)

但是返回一行,填充^J作为分隔符(很奇怪?),当然也没有这样的文件。将IFS更改为\n也无效。

我目前的解决方法是使用我感兴趣的所有文件构建一个临时文件,然后使用while:

tmpfile=$$.$(date +'%Y%m%d%k%M%S').tmp
find . -type f -name *.txt > $tmpfile
while read file ; do
    # do something with file
done < $tmpfile ; rm $tmpfile

但这感觉不对,而且代码比第一个选项多得多。 有人能告诉我执行第一个循环的正确方法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

在这种情况下,您需要流程替换,而不是命令替换:

while IFS= read -r file ; do
    # do something with file
done < <(find . -type f -name *.txt)

<()进程替换基本上就像一个文件,您可以将其重定向到while循环。