让glob遵循Python中的符号链接

时间:2017-10-02 16:31:40

标签: python python-3.x symlink

假设我有一个符号链接的子目录,如下所示:

subdir/
    folder/
        readme.txt
    symlink/ => ../hidden/
hidden/
    readme.txt

如果我运行以下代码:

>>> from pathlib import Path
>>> list(Path('./subdir/').glob('**/readme.txt'))

我希望结果如下:

subdir/folder/readme.txt
subdir/symlink/readme.txt

但实际结果是:

subdir/folder/readme.txt

我发现这是因为(对于某些未记录的原因)**运算符不遵循符号链接。

有没有办法以实际方式更改此配置?

2 个答案:

答案 0 :(得分:1)

pathlib.glob也不适用于**和符号链接。我发现了相关问题https://bugs.python.org/issue33428

作为Python3的替代方案,您可以将glob.glob**recursive=True选项一起使用(请参阅详细信息https://docs.python.org/3/library/glob.html

In [67]: from glob import glob
In [71]: list(glob("./**/readme.txt", recursive=True))
Out[71]:
['./hidden/readme.txt',
 './subdir/folder/readme.txt',
 './subdir/symlink/readme.txt']

In [73]: list(glob("./**/readme.txt", recursive=False))
Out[73]: ['./hidden/readme.txt']

比较:

In [72]: list(Path('.').glob('**/readme.txt'))
Out[72]: [PosixPath('hidden/readme.txt'), PosixPath('subdir/folder/readme.txt')]

答案 1 :(得分:0)

我之前从未使用过<form action="whereYouWillHaveAllThisData.php" method="GET"> <input type="text" name="name" > <input type="text" name="email" > </form> ,因此您可以扩展此解决方案以利用其中的一些功能,但我只能使用pathlib才能使用此功能。

glob

输出:

from glob import glob
list(glob('./subdir/*/readme.txt'))

如果您开始使用具有多个深度子目录的['./subdir/folder/readme.txt', './subdir/symlink/readme.txt'] ,那么该hackish解决方案是将包含额外glob的变体(例如*/)包括在内任意深度,并连接每个变体的结果。

执行所需操作的更合适的方法是编写具有所需行为的自定义函数(通过符号链接搜索到任意深度),并以您希望的方式处理圆形路径的大小写。有关使用./subdir/*/*/*/readme.txt执行此操作的提示,请参阅this question(请记得设置os.walk)。