0

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

我找到了一种解决方案,即用 a 逐行读取输入,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

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

谢谢!

4

1 回答 1

1

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

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

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

于 2012-05-14T10:21:31.110 回答