Python os.walk()函数与find命令

时间:2019-02-01 22:53:10

标签: python find os.walk

我正在编写一个程序来遍历文件系统以收集文件信息以放入数据库中。我尝试过一辈子的shell脚本学习python,并且发现在find返回和os.walk返回之间存在问题

find THIS_PATH -print

for dirpath, dirs, files in os.walk( THIS_PATH ):
    print ( root )
    for fname in files:
        print ( os.path.join( root, fname ) )

我遇到的问题是“ OS” find将符号链接返回到目录,但是python find没有,并且我也不知道如何使它执行此操作。现在,我不希望它跟随它们(即followlinks=True),这也会与find产生不同的结果。但是我希望能够打印作为目录符号链接的条目。

谢谢 c

1 个答案:

答案 0 :(得分:4)

如果要获得相同的输出(排序可能会有所不同),则需要打印给定路径的目录和文件。 find返回目录以及链接(指向任何内容)。对您代码的最小更改是:

print(THIS_PATH)
for dirpath, dirs, files in os.walk(THIS_PATH):
    for fname in dirs + files:  # iterate over items form both lists
        print (os.path.join(dirpath, fname))

使用pathlib可能会更容易一些:

from pathlib import Path
mypath = Path(THIS_PATH)
for found_item in mypath.rglob('*'):
    print(mypath.joinpath(found_item))

例如,我创建了以下树:

.
├── d1
│   ├── d2
│   │   └── f2
│   └── f1
├── f2 -> d1/d2/f2
└── l1 -> d1

运行find将产生(注意目录和目录链接的显示方式相同):

$ find .
.
./f2
./l1
./d1
./d1/.h
./d1/d2
./d1/d2/f2
./d1/f1

和运行与第一个片段THIS_PATH='.'产生相同的项目(以稍微不同的顺序,find将默认为深度优先,os.walk确实广度优先)。对于pathlib示例只是洁具如果THIS_PATH'.',如它会终日啃食前导./关闭。