Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
让glob跟踪Python中的符号链接_Python_Python 3.x_Symlink - Fatal编程技术网

让glob跟踪Python中的符号链接

让glob跟踪Python中的符号链接,python,python-3.x,symlink,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

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

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
我发现这是因为(出于一些未记录的原因),**操作员不遵循符号链接


是否有一种实用的方法来更改此配置?

我以前从未使用过
pathlib
,因此您可以扩展此解决方案以利用其某些功能,但我仅使用
glob
实现了这一点

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

['./subdir/folder/readme.txt', './subdir/symlink/readme.txt']
如果你设置使用
glob
的子目录有一个以上的深度,那么黑客的解决方案是将附加
*/
(例如
/subdir/*/*/*/*/readme.txt
)的变体添加到任意深度,并将每个变体的结果连接起来


更合适的方法是编写具有所需行为(通过符号链接搜索到任意深度)的自定义函数,并以所需方式处理循环路径的情况。请参阅以获取有关使用
os.walk
(记住设置
followlinks=True
)执行此操作的提示。

pathlib.glob
也不适用于
**
和符号链接。我发现了相关的问题

作为Python3的替代方案,您可以将
glob.glob
**
recursive=True
选项一起使用(请参阅详细信息)

与之相比:

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

这很奇怪,因为有人要求
glob
选择不跟随符号链接。@JeremyMcGibbon你永远无法取悦所有人,嘿?
Path.glob
glob
使用相同的功能-我发现的问题是,glob在使用
**
时不喜欢使用符号链接。是否有原因不能使用
*
而不是
**
,因为目录结构具有特定的深度?有趣的是,它对
**
具有相同的行为。我猜这种行为的原因是为了避免在创建目录循环的符号链接的情况下出现无限深度的问题。我正在尝试编写一个足够抽象的解决方案,以使它能够在少数情况下使用。在某些情况下,readme.txt文件可能隐藏在更新的解决方案中,以反映您对更深层路径的需求。
In [72]: list(Path('.').glob('**/readme.txt'))
Out[72]: [PosixPath('hidden/readme.txt'), PosixPath('subdir/folder/readme.txt')]