Python:文件计数递归但不能获得准确的计数

时间:2013-12-13 07:55:20

标签: python

为什么Unix命令和python之后的结果不同?

使用find命令

rahul@home-pc:~$ find /opt/ -type f | wc -l
1331

使用Python 2.7.3

In [31]: sum([len(f) for p,d,f in os.walk('/opt/') ])
Out[31]: 1340

In [32]: t=0

In [33]: for p,d,f in os.walk('/opt'):
             t = t + len(f)

In [34]: t
Out[34]: 1340

那么如何使用python获得准确的计数?

更新1# find和os.walk,也算隐藏文件

root@home-pc:~# touch /opt/.xxx
root@home-pc:~# find /opt/ -type f | wc -l
1332
root@home-pc:~# find /opt/ -type f | grep .xxx
/opt/.xxx
root@home-pc:~# python -c "import os; print sum([len(f) for p,d,f in os.walk('/opt/')])"
1341

更新2# 这两个工具也算硬链接

root@home-pc:~# ln /tmp/t /opt/abc
root@home-pc:~# find /opt/ -type f | wc -l
1333
root@home-pc:~# python -c "import os; print sum([len(f) for p,d,f in os.walk('/opt/')])"
1342

更新3# 感谢@thefourtheye,答案是正确的os.walk计数软链接作为普通文件:

root@home-pc:~# ln -fs /tmp/test_f /opt/test_f
root@home-pc:~# find /opt/ -type f | wc -l
1333
root@home-pc:~# python -c "import os; print sum([len(f) for p,d,f in os.walk('/opt/')])"
1343

1 个答案:

答案 0 :(得分:4)

os.walk将软链接视为普通文件,而find则不将软链接视为普通文件。这就是你看到计数差异的原因。

要获得一致的计数,请像这样更改find​​命令

find /opt/ -type f -follow 

并在followlinks = True中使用os.walk,就像这样

os.walk("/opt/", followlinks = True)