【问题标题】:python glob.glob - how to find a specific file (or a list of files) without knowing how deep it in in subdirs?python glob.glob - 如何在不知道子目录中的深度的情况下找到特定文件(或文件列表)?
【发布时间】:2012-09-25 21:10:30
【问题描述】:

现在,我使用 subprocess 调用 find,它可以很好地完成工作,但我追求的是一种 Python 的做事方式。

这是当前代码:

cmd = "find /sys/devices/pci* | grep '/net/' |grep address"
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)

在输出中我收到以下列表:

[root@host1 ~]# find /sys/devices/pci* |grep '/net/'|grep 'address'
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:00.0/0000:08:00.0/net/eth0/address
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:01.0/0000:09:00.0/net/eth1/address
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:02.0/0000:0a:00.0/net/rename4/address
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:03.0/0000:0b:00.0/net/eth3/address
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:04.0/0000:0c:00.0/net/eth4/address
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:05.0/0000:0d:00.0/net/eth5/address
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:06.0/0000:0e:00.0/net/eth6/address
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:07.0/0000:0f:00.0/net/eth7/address
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:08.0/0000:10:00.0/net/eth8/address
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:09.0/0000:11:00.0/net/eth9/address
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:0a.0/0000:12:00.0/net/eth10/address
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:0b.0/0000:13:00.0/net/eth11/address

现在,如果我执行glob.glob('/sys/devices/pci*/*/*/*/*/*/*/net/'),我会得到一个目录列表,我什至可以查找文件,但它肯定似乎比find 花费更长的时间,即使通过子进程也是如此。而且结果集很大,不知道具体hosts的架构是否会有相同的目录结构,所以不知道glob.glob()要输入多少个星号。

我的问题是,我怎样才能重复简单的find | grep 命令实现的行为,或者,如果有更好的方法来查找主机拥有的所有 NIC 的所有 MAC,无论是否处于活动状态(我'在这里寻找特定的 MAC 模式)

编辑:不应该使用 glob,os.walk 似乎正在做这项工作:

>>> for root, dirs, names in os.walk('/sys/devices/'):
...     if 'address' in names and 'pci' in root:
...         f = open(str(root + '/address'), 'r')
...         mac = f.readlines()[0].strip()
...         f.close()
...         print mac
...         eth = root.split('/')[-1]
...         print eth

【问题讨论】:

    标签: python linux networking glob


    【解决方案1】:

    你检查过 os.walk() 吗?

    import os
    for root, dirs, names in os.walk(path):
        ...
    

    http://docs.python.org/library/os.html#os.walk

    从上面的链接,这里是跳过某些目录的方法:

    import os
    from os.path import join, getsize
    for root, dirs, files in os.walk('python/Lib/email'):
        print root, "consumes",
        print sum(getsize(join(root, name)) for name in files),
        print "bytes in", len(files), "non-directory files"
        if 'CVS' in dirs:
            dirs.remove('CVS')  # don't visit CVS directories
    

    【讨论】:

    • 如果您知道某些子目录不包含您要查找的文件,您可以从dirs 变量中del 它们,这样它就不会被处理。例如,您可以跳过所有与 /sys/devices/pci* 不匹配的目录,如果它变得昂贵的话。
    • 嗨菲利普,你能提供一个例子来说明这个del的用法吗?我显然不是一个非常有经验的pythonista,但是:)
    • 啊!所以我可以随时篡改目录,这会影响搜索!这是完美的,谢谢
    猜你喜欢
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 2018-09-22
    相关资源
    最近更新 更多