1

我有一组文件,每个文件都包含一个(整数)数字,这是同名目录中的文件数(不带 .txt 后缀) -wc每个目录上的 a 的结果。

我想总结文件中的数字。我试过了:

i=0; 
find -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | while read j; do i=$i+`cat $j.txt`; done
echo $i

但答案是 0。如果我只是echo输出cat

i=0; find -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | while read j; do echo `cat $j.txt`; done

值在那里:

1313
1528
13465
22258
7262
6162
...

大概我必须以cat某种方式投射输出?

[编辑]

最后我确实找到了自己的解决方案:

i=0; 
for j in `find -mindepth 1 -maxdepth 1 -type d -printf '%f\n'`; do 
    expr $((i+=$(cat $j.txt))); 
done; 

28000
30250
...
...
647185
649607

但接受的答案更简洁,因为它不会一路输出

4

2 回答 2

4

你对输出求和的方式cat应该有效。但是,您得到0的原因是您的while循环在子shell 中运行,因此一旦循环结束,存储总和的变量就会超出范围。有关详细信息,请参阅BashFAQ/024

这是解决它的一种方法,使用进程替换(而不是管道):

SUM=0
while read V; do
    let SUM="SUM+V" 
done < <(find -mindepth 1 -maxdepth 1 -type d -exec cat "{}.txt" \;)

请注意,我冒昧地更改了 find/cat/sum 操作,但您的方法也应该可以正常工作。

于 2011-11-17T12:00:28.143 回答
1

我的单线解决方案不需要 find :

echo $(( $(printf '%s\n' */ | tr -d / | xargs -I% cat "%.txt" | tr '\n' '+')0 ))
于 2011-11-18T01:19:47.850 回答