让Glob跟随Python中的符号链接

bas*_*aus 6 python symlink python-3.x

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

subdir/
    folder/
        readme.txt
    symlink/ => ../hidden/
hidden/
    readme.txt
Run Code Online (Sandbox Code Playgroud)

如果我运行以下代码:

>>> from pathlib import Path
>>> list(Path('./subdir/').glob('**/readme.txt'))
Run Code Online (Sandbox Code Playgroud)

我希望结果是:

subdir/folder/readme.txt
subdir/symlink/readme.txt
Run Code Online (Sandbox Code Playgroud)

但是实际结果是:

subdir/folder/readme.txt
Run Code Online (Sandbox Code Playgroud)

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

有没有办法实用地更改此配置?

Rom*_*hik 5

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

作为 Python3 的替代方案,您可以使用glob.globwith**recursive=Trueoption(请参阅详细信息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']
Run Code Online (Sandbox Code Playgroud)

相比于:

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


Jer*_*bon 1

我以前从未使用过pathlib,因此您可以扩展此解决方案以利用其某些功能,但我glob仅使用它即可工作。

from glob import glob
list(glob('./subdir/*/readme.txt'))
Run Code Online (Sandbox Code Playgroud)

输出:

['./subdir/folder/readme.txt', './subdir/symlink/readme.txt']
Run Code Online (Sandbox Code Playgroud)

如果您打算使用glob多个子目录深度,那么黑客解决方案是包含具有额外*/(例如./subdir/*/*/*/readme.txt)的变体,直至某个任意深度,并将每个变体的结果连接起来。

执行您想要的操作的更合适的方法是编写一个具有您想要的行为的自定义函数(搜索符号链接到任意深度),并以您想要的方式处理圆形路径的情况。请参阅此问题以获取有关执行此操作的提示os.walk(请记住设置followlinks=True)。

  • `Path.glob` 和 `glob` 使用相同的功能 - 我发现的问题是 glob 在使用 `**` 时不喜欢跟随符号链接。 (2认同)