繁体   English   中英

带有损坏链接的 pathlib.Path

[英]pathlib.Path with broken links

我使用pathlib.Path模块已经有一段时间了,因为它比os.path灵活和可读得多。 直到现在,我还没有发现Path没有涵盖的案例。

我有一个目录,其中包含指向我无权访问的目录的链接(我不属于该组)。 例如:

> ls dir1
dir1/link1 -> /another_dir/file (No access)

根目录( p对象)包含几个子目录,损坏的链接可以位于子树的各个级别。

我正在尝试找到这些损坏的链接并将其删除。 但是我没有找到正确的方法:

  • 如果我使用rglob , function 只返回有效的文件和目录,所以这段代码不会返回损坏的链接:

     for f in p.rglob("*"): if not f.exists(): print(f"{f} does not exist")
  • 如果我使用iterdir() ,我必须对每个子目录递归执行它,并且在exists() function 之上触发我需要捕获的异常 ( PermissionError )。

     >>> p = Path('dir1/link1') >>> p.is_symlink() True >>> p.exists()... PermissionError: [errno 13] Permission Denied: 'dir1/link1'

所以我认为这是我将 go 返回到os.walkos.path.exists()的情况,因为这个 function 为断开的链接返回False

    for root, _, files in os.walk(str(p)):
        for f in files:
            filename = os.path.join(root, f)
            if os.path.islink(filename) and not os.path.exists(filename):
                os.unlink(filename)

在这里正确使用pathlib的任何解决方案?

所以我能找到的最好的pathlib是下面的,与评论一致。

for dir in p.rglob("**/"):
    for filename in dir.iterdir():
        if filename.is_symlink():
            try:
                if not filename.exists():
                    print(f"{filename} is a broken link")
            except PermissionError:
                print(f"{filename} links to an file we cannot access")

两个print语句可以用一个动作代替(如os.unlink )。

虽然大多数时候我更喜欢使用pathlib而不是os.path ,但在这种情况下os.path实现更容易编写:

for root, _, files in os.walk(str(p)):
    for f in files:
        filename = os.path.join(root, f)
        if os.path.islink(filename) and not os.path.exists(filename):
            os.unlink(filename)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM