【问题标题】:How to handle OSX Aliases in Python with os.walk()?如何使用 os.walk() 在 Python 中处理 OSX 别名?
【发布时间】:2014-03-08 10:08:29
【问题描述】:

我正在使用 Python 2.7.x 遍历目录树,获取遍历时的文件和目录大小。我遇到的问题是将别名文件误认为目录,然后抛出“没有这样的文件或目录”的错误。

代码如下:

def get_size(start_path = '.'):
    total_size = 0
    for dirpath, dirnames, filenames in os.walk(start_path):
        for f in filenames:
            fp = os.path.join(dirpath, f)
            total_size += os.path.getsize(fp)
    return total_size

for dirName, subdirList, fileList in os.walk(rootDir, topdown=False):

    dirSize = get_size(dirName) #this throws an error on alias files

    for fname in fileList:
              #do other things

我也尝试了 os.path.isdir() ,但它不起作用。此外,我尝试了

return File.FSResolveAliasFile(path, True)[0].as_pathname()

但这似乎并没有提取所有别名文件。

有什么想法吗?

【问题讨论】:

  • 别名是指符号链接吗?
  • @warunsl 我很确定他指的是可以使用 Finder 中的“制作别名”选项创建的 OS X 特定别名文件。 (en.wikipedia.org/wiki/Alias_%28Mac_OS%29)
  • @ballofpopculter 您的代码在 OS X 10.9.2 上的 Python 2.7.5 中在别名和符号链接上都运行良好。别名被视为文件,符号链接被跳过。

标签: python macos os.walk os.path


【解决方案1】:

有关背景信息,请参阅我对 https://stackoverflow.com/a/21197881/838253 的评论。

简短的回答是您不能在 Python 中执行此操作。有一个解析别名的库,但这依赖于一个过时的 Carbon 库,不再有效。

您可以在终端检测别名。

可能因为别名有扩展属性,所以可以区分。

【讨论】:

    【解决方案2】:

    MacOSX 中似乎有三种类型的链接。

    • 别名(可以通过右键菜单“创建别名”执行)
    • 软链接
    • 硬链接

    别名链接似乎在 MacOSX 上是特定的。

    而且 python 2.7 似乎没有将 Alias 链接识别为链接。

    为了确保,试试这个。

    os.path.islink("./alias-you-created")
    >>> False
    

    所以它不被视为链接。

    IMO 我认为 python 2.7 不支持 MacOSX Alias 作为链接。但是我不明白为什么MacOSX有这样的功能,太复杂了。

    这是我找到的相关信息。

    【讨论】:

    • 上面的第一个链接很有趣,但不正确。 Alias 可能包含 inode,但它们没有记录在案。 inode 只能在单个分区上工作,但Alias 可以跨分区或磁盘工作,所以它必须依赖其他东西。它也无法解释为什么 Alias 如此之大 - 通常是 MB
    • 别名很大,因为它们存储了多种尺寸的视网膜图标。这是讨论的链接:apple.stackexchange.com/questions/81671/…
    猜你喜欢
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 2015-08-11
    • 2016-07-05
    相关资源
    最近更新 更多