2012-10-04 1 views
3

지금 당장은 서브 프로세스를 사용하여 find을 호출합니다.하지만 작업을 수행하는 파이썬 방법을 따릅니다. 내가 glob.glob('/sys/devices/pci*/*/*/*/*/*/*/net/')을 할 경우 내가 디렉토리의 목록을받을 수 있나요,python glob.glob - 특정 파일 (또는 파일 목록)을 찾아내는 방법을 subdirs에서 얼마나 깊게 알 수 있습니까?

[[email protected] ~]# 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 

지금, 나는 심지어 수 : 나는 다음과 같은 목록이 표시 출력에

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

:

여기에 현재 코드입니다 파일을 찾으십시오. 그러나 심지어 서브 프로세스를 통해서도 find보다 오래 걸리는 것으로 보입니다. 또한 결과 집합은 매우 거대하며 특정 호스트의 아키텍처가 동일한 디렉토리 구조를 가질 지 여부를 미리 알 수 없으므로 glob.glob()에 입력 할 별표 수를 알 수 없습니다.

내 질문에 간단한 find | grep 명령이 수행하는 동작을 어떻게 반복 할 수 있습니까, 아니면 호스트가 가지고있는 모든 NIC의 모든 MAC을 찾는 더 좋은 방법이 있다면 (예 : 여기에 특정 MAC 패턴)를 찾고 있어요

편집 : 글로브를 사용하지 않았을 경우, 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 

답변

4

당신이 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 
+0

덕분에,이 일을 내가 편집 – dyasny

+0

큰 Iin에 답을 추가 :

import os for root, dirs, names in os.walk(path): ... 
위의 링크에서 http://docs.python.org/library/os.html#os.walk

, 여기에 특정 디렉토리를 건너 뛸 수있는 방법입니다! 해피 코딩! – bohney

+0

일부 하위 디렉토리에 찾고있는 파일이 포함되어 있지 않다면'dirs' 변수에서'del'하여 처리되지 않도록 할 수 있습니다. 예를 들어,'/ sys/devices/pci *'와 일치하지 않는 디렉토리를 모두 건너 뛸 수 있습니다. –