有时我必须遍历目录中的所有文件才能找到一些东西,而通常for i in $(ls *.txt)
通常会起作用。但有些情况下,文件夹中的文件太多而for
会产生0403-027 The parameter list is too long.
(即for
,diff
,ls
或其他任何内容
我已经找到了一个解决方案就是用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
但这感觉不对,而且代码比第一个选项多得多。 有人能告诉我执行第一个循环的正确方法吗?
谢谢!
答案 0 :(得分:1)
在这种情况下,您需要流程替换,而不是命令替换:
while IFS= read -r file ; do
# do something with file
done < <(find . -type f -name *.txt)
<()
进程替换基本上就像一个文件,您可以将其重定向到while循环。