如何在Linux上使用Python检查NTFS分区中的隐藏文件和文件夹?

6
我正在使用linux机器上的NTFS分区。我想使用python识别在NTFS分区中隐藏的文件和文件夹。
请问如何使用python实现此功能?如果有代码片段/链接将不胜感激。
谢谢。

你现在有什么进展?你能识别非隐藏文件吗? - johnsyweb
@Johnsyweb:我只有在Linux平台上识别隐藏文件的代码..即以“.”(点字符)开头的所有文件/文件夹。我的要求是检测连接到我的Linux机器的带有NTFS分区的USB硬盘上的隐藏文件和文件夹。 - Mahendra Liya
你是指带有“hidden”属性的文件吗?还是一些在os.walk中不显示的特殊文件? - AndiDog
@AndiDog:是的,我指的是带有“隐藏”属性的文件。我在检测Windows文件中的隐藏文件和文件夹方面遇到了问题,这些文件是通过连接NTFS分区的USB硬盘驱动器到我的Linux机器来访问的。希望能澄清疑虑。 - Mahendra Liya
3个回答

6
假设您在Linux上使用ntfs-3g挂载NTFS分区(这是当前大多数Linux发行版的默认设置)。

您需要读取文件扩展属性(请参见attr(5)),可以使用pyxattr。 NTFS属性存储在system.ntfs_attrib扩展属性中,作为一组标志的值,在ntfs-3g文档中有记录。

下面是一个示例代码,用于读取和解码NTFS文件系统属性并使用它们来过滤文件:

import os, struct, xattr

# values from http://www.tuxera.com/community/ntfs-3g-advanced/extended-attributes/
attributes = ['readonly', 'hidden', 'system', 'unknown',
              'unknown', 'archive', 'unknown', 'unknown',
              'temp', 'unknown', 'unknown', 'compressed_dir',
              'offline', 'not_content_indexed' ] + ['unknown']*18

def ntfs_attr(path):
    attr = struct.unpack("i", xattr.get(path, "system.ntfs_attrib"))[0]
    for shift, attribute in enumerate(attributes):
        if (attr >> shift) & 1 == 1:
            yield attribute

def main():
    import sys
    if len(sys.argv) != 3:
        print "Usage: %s path attribute" % sys.argv[0]
        a = set(attributes)
        a.remove('unknown')
        print "where attribute is one of:", ' '.join(a)
        sys.exit(1)

    path = sys.argv[1]
    attribute = sys.argv[2]
    print "Files with %s attribute in %s:" % (attribute, path)
    for filename in os.listdir(path):
        fullname = os.path.join(path, filename)
        if attribute in ntfs_attr(fullname):
            print fullname


if __name__ == '__main__':
    main()

1

在Linux下似乎没有Python接口支持NTFS属性。

NTFS-3G支持NTFS文件属性,并将其公开为Linux工具getfattrsetfattr的读取和设置方式。

您可以使用Python的subprocess来调用getfattr,然后解析输出。

注意:在我的Ubuntu系统上,我需要安装attr软件包才能获得命令getfattrsetfattr


在测试之前,我想问一下您,“winsys”能在Linux机器上运行吗? - Mahendra Liya
@mahendraliya:WinSys包装了Windows API,因此肯定不能在Linux下使用。我重写了我的答案。 - Lesmana
如果有一个用于读取扩展属性的Python模块,为什么要费心使用外部命令(对于大量调用而言速度较慢!)?您的答案还包含一个事实错误:NTFS文件属性几乎从一开始就由NTFS-3G支持(作为system.ntfs_attrib属性)。仅在ntfs-3g-2011.1.15或更高版本中可用的是system.ntfs_attrib_be属性,它只是system.ntfs_attrib的字节序固定版本。 - abbot
@abbot:我同意使用Python模块更好。我不知道有这样一个模块。我不同意我的帖子中存在事实错误。属性system.ntfs_attrib_be是用于命令getfattrsetfattr的,这正是我在我的答案中写的。 - Lesmana
您也可以使用system.ntfs_attrib与getfattr/setfattr而不会出现任何问题。 - abbot

0

如果你的问题不仅限于Python,你可以尝试我用shell脚本实现的例子。

这也是基于NTFS-3G中的system.ntfs_attrib_be属性。如果你只是要使用它而不关心它是如何实现的(用Python还是shell),只需从你的发行版下载并安装getfattrsetfattr,然后使用它即可。

https://gist.github.com/Explorer09/ac4bf6838c271a9968b3


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接