为什么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
答案 0 :(得分:4)
os.walk
将软链接视为普通文件,而find
则不将软链接视为普通文件。这就是你看到计数差异的原因。
要获得一致的计数,请像这样更改find命令
find /opt/ -type f -follow
并在followlinks = True
中使用os.walk
,就像这样
os.walk("/opt/", followlinks = True)