2013-05-07 4 views
2

디렉토리의 내용을 검토하고 각 항목이 파일인지 폴더인지 확인하려고합니다. 네,paramiko의 파일 또는 디렉토리를 구분하십시오.

>>> for i in ftp.listdir(): 
...  lstatout=str(ftp.lstat(i)).split()[0] 
...  if 'd' not in lstatout: print i, 'is a file' 
... 

이 작동 : 나는 this link에서 제안 된 솔루션을 할 수 있습니다. sidenote로서, 나는 단지 .split() 대신에 첫 번째 문자를 취하고있다. 따라서 str(ftp.lstati(i))[0] != 'd'은 필자의 비 과학적 테스트에서 더 빠르다.

그러나 이것은 매우 해킹 된 것처럼 보입니다. 그래서 나는 다른 방법을 조사하려고했습니다. SFTP를 몇 폴더 속성에서 나는 참조 :

<SFTPAttributes: [ size=4096 uid=1002 gid=1002 mode=040755 atime=1358785383 mtime=1359475285 ]> 

파일에 대해 동일한에서, 내가 볼 때 :

<SFTPAttributes: [ size=72 uid=1002 gid=1002 mode=0100644 atime=1367598914 mtime=1367598914 ]> 

그래서 모드에 대한 파일 010[permissions]040[permissions] 것 같다 디렉토리 (필자가 본 몇몇 디렉토리에서 일관성이 있지만 보편적이라고 말할 수는 없다). 이것은 항목의 속성을 얻는 훨씬 더 좋은 방법 인 것 같습니다! 그러나 ftp.stat(i).st_mode을 사용하면 위의 디렉토리에 대해 16877과 위의 파일에 대해 33188이라는 다른 값을 얻게됩니다.

이들은 무엇을 의미합니까? 그 정수를 파일 모드로 변환 할 수있는 방법이 있습니까? (나는 구글을 시도했지만 관련있는 것을 찾을 수 없다.) 또는, str(lstat(i)) 함수가 'd'또는 not-'d '를 리턴하는 것에 의존하지 않고 이것을 결정할 수있는 좋은 방법이 있는가?

+1

모드는 8 진수입니다. 모드를 보려면'oct (integerValue)'를 할 수 있습니다. – sberry

답변

2

높은 비트가 실제로는 파일이나 디렉토리인지 알수 않는 것 같습니다 :

S_ISDIR
S_ISREG

>>> oct(16877) 
'040755' 
>>> oct(33188) 
'0100644' 

와 마찬가지로 :

>>> int('040755', 8) 
16877 
>>> int('0100644', 8) 
33188 
1

Paramiko의 SFTPAttributes.st_mode 분석을 위해 Python의 os.stat으로 전달 될 수 있습니다. :

for file in ftp_cli.listdir_attr(path): 
    is_dir = stat.S_ISDIR(file.st_mode) 
    is_link = stat.S_ISLNK(file.st_mode) 
    is_file = stat.S_ISREG(file.st_mode) 
+1

같은 것의 또 다른 변형 : '수입 통계' 'is_dir = stat.S_ISDIR (ftp.stat (remotepath) .st_mode)' – cowlinator

관련 문제