Python:检查目录是否是别名

时间:2014-01-17 17:30:20

标签: macos python-2.7 directory-structure

python是否有一个简单的函数来检查目录是否是一个实际目录,或者它只是另一个目录的别名?我正在尝试列出目录中的所有文件/文件夹,但由于这些别名文件夹,我得到的东西看起来像这样:

/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bundle/Home/bundle/Home/bundle/Home/bundle/Home/bundle/Home/bundle/Home/bundle/Home/捆绑/主页/束/主页/束/主页/束

Directory Alias

我知道我可以编写一个比较路径并退出的函数,如果它好像我要进入圆圈,但是有一个简单的函数可以完全按照我不知道的那样做吗? 例如。 os.isAlias( …pathname… )

谢谢!

3 个答案:

答案 0 :(得分:3)

这是os.path.realpath的一个版本,适用于Mac别名以及Python 2下的符号链接

from Carbon import File
def osx_realpath (path):
    return File.FSResolveAliasFile(path, True)[0].as_pathname()

如果在递归之前在每个目录上调用osx_realpath,则应避免重复。或者,您可以定义类似

的内容
def is_osx_realpath (path):
    return path == osx_realpath(path)

但是,你必须担心漏报。如果你过滤is_osx_realpath并且你开始的路径是别名,你的程序将停止而不看任何东西。

到目前为止,我还不知道如何在Python 3下执行此操作。我有一个问题here,我希望得到答案。现在,我不能比使用subprocess.call invoke something that does the check on the command line更好。

编辑:我应该补充一点,不仅在Python 3中没有Carbon.File,而且它已被弃用,因此最好在Python 2中避免 - 但它是我所知道的最实用的解决方案目前用于Python 2。

编辑2:这是一种检查文件是否是我认为对Python 3友好的别名的方法。但是,我没有代码来解析别名。我相信你需要安装PyObjC。

from AppKit import NSWorkspace
def is_alias (path):
    uti, err = NSWorkspace.sharedWorkspace().typeOfFile_error_(
        os.path.realpath(path), None)
    if err:
        raise Exception(unicode(err))
    else:
        return "com.apple.alias-file" == uti

source

答案 1 :(得分:1)

上面的答案是不正确的。 虽然Finder确实将符号链接作为别名报告,但它们是不同的东西。

符号链接是UNIX的基本功能,但别名是仅限Apple的功能。 如果您怀疑这会创建一个目录和别名的符号链接。符号链接通常为50-100字节,而别名可以是几MB。

os.path.islink( … )会报告符号链接,但不会报告别名。

我不确定如何在Python中找到它们,但以下链接显示了其他方法。

https://stackoverflow.com/a/21151368/838253

答案 2 :(得分:0)

您可以在Mac OS X中检查文件或目录是否为GetFileInfo命令的别名。GetFileInfo -aa foo使用" 1"打印一行。如果foo是别名而且" 0"如果没有。

import subprocess

def is_alias(path):
    return subprocess.check_output(["GetFileInfo", "-aa", path]) == "1\n"

似乎有点伤感产卵的过程,每检查,但我想这样的作品与Mac OS X版本,因为可能10.4.4(2006),32位,64位,Python 2和Python的3。 GetFileInfo的版本(从2009年开始)是一个"通用" i386 + PPC二进制文件。

GetFileInfo是Xcode的一部分,它很大,但您可以单独下载命令行工具(请参阅"单独下载"部分here)。

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/GetFileInfo.1.html