我有这个:
tee < /some/big/file >(wc -c) >(md5sum) | ...我不想将wc -c和md5sum的结果写到标准输出中,而是希望将结果存储到两个变量中,以便以后处理。我不想多次读取该文件。我如何才能做到这一点?
发布于 2013-05-10 09:45:27
这并不能直接回答你的问题...但您只需读取该文件一次,并且不必使用tee。
SIZE=$(wc -c /some/big/file)
MD5=$(md5 /some/big/file)那么,这会读取文件多少次呢?一次。这是因为wc -c实际上并不读取文件,它只是查看文件有多长并返回报告。以下是我的测试:
$ time wc -c /big/file >/dev/null
real 0m0.003s
user 0m0.000s
sys 0m0.000s
$ time wc -c </big/file >/dev/null
real 0m0.004s
user 0m0.000s
sys 0m0.000s
$ time cat /big/file | wc -c >/dev/null
real 0m52.945s
user 0m0.160s
sys 0m19.612s教训:不要将tee (或cat)与wc -c混为一谈,因为这非常浪费时间。只要正常执行md5就行了,不用担心wc -c。
注意:wc -c <file速度快的原因是它获得了一个普通的文件句柄,就像wc自己调用了open()一样。
管道性能
您几乎不应该在管道中使用cat。
cat file | cmd # slow
cmd <file # fast调用cat通常意味着创建一个没有任何用途的额外进程。在某些情况下,就像使用wc -c一样,它实际上会在管道之后减慢程序的运行速度。我的意思是,你可以把cat放在你喜欢的任何地方,但这太愚蠢了:
echo 'hello, world' | cat
cat file.txt | less
cat file.txt | cat | less
cat file.txt | cat | sort | cat | cat | uniq | cat >file_unique.txt这样更好:
echo 'hello, world'
less file.txt
sort file.txt | uniq >file_unique.txthttps://stackoverflow.com/questions/16473767
复制相似问题