2016-06-22 7 views
2

これは問題ですが、私はWindows上でプロジェクトに取り組んでいます(私のものではありません)、そして最終的にLinux上で完全に機能するフォークを持つことに決めました。元のプログラマーは、ケースを無条件でコーディングし、開かれたものを呼び出し、小文字のoを小文字で使用して呼び出す...クレイジー...右か?まあ、私はフォルダやファイルを下げるためにすべてのケースをフラットにするpython3スクリプトを作成することができましたが、ファイル内のすべての変更を修正しなければならなかったので、すべての変更を "メモリ内"で行い、プロジェクト内のファイルを更新し、それぞれを更新します。まあ、それは95%多かれ少なかろうとした、まだ修正されていないファイルがたくさんありました...私の頭は、この瞬間、任意の提案で "なぜ"を見つけることができません?パス内のフォルダ内に深い小文字のファイルがあります

#! /usr/bin/env python 
import os 
import re 
import time 
import string 
import mimetypes 
import subprocess 

keys = set() 

def flat(path): 
    list = os.listdir(path) 
    for item in list: 
     obj = os.path.normpath(path+item) 
     obj_new = os.path.normpath(path+item.lower()) 
     if os.path.isfile(obj): 
      keys.add(item) 
      if item!=item.lower(): 
       print('[Yes]',obj, '-->', obj_new) 
       os.replace(obj, obj_new) 
      else: 
       print(' [No]',obj) 
     else: 
      obj = obj + '/' 
      flat(obj) 
      item = item + '/' 
      keys.add(item) 
      if item!=item.lower(): 
       print('[Yes]',obj, '-->', obj_new) 
       os.replace(obj, obj_new) 
      else: 
       print(' [No]',obj) 

def insidefix(path, keys): 
    list = os.listdir(path) 
    for item in list: 
     obj = os.path.normpath(path+item) 
     if os.path.isfile(obj):   
      (mime,enc) = mimetypes.guess_type(obj) 
      parts = re.split('\.', item) 
      ext = parts[len(parts)-1] 
      if mime!=None: 
       t = re.split('/', mime) 
       if (t[0]=='text') | (ext in set): 
        print('Fixing -->',obj, '|', mime) 
        for ref in keys: 
         pattern = '' 
         for c in range(len(ref)): 
          if (ref[c].isalpha()): 
           pattern=pattern+'['+ref[c].upper()+ref[c].lower()+']' 
          else: 
           pattern = pattern + ref[c] 
         arg= 's|'+pattern+'|'+ref.lower()+'|g' 
         subprocess.call(["/bin/sed", "-i", arg, obj]) 
         print("/bin/sed", "-i", arg, obj) 
     else: 
      obj = obj + '/' 
      insidefix(obj, keys) 

def runingtime(t): 
    h=m=s=0 
    for i in range(t): 
     if s==60: 
      m+=1 
      s=0 
     if m==60: 
      h+=1 
      m=0 
     s+=1 
    print(h,':',m,':',s) 

path = '/warehouse/projects/igp/' 
set=['php','txt','css','log','sym','map','htm','thmx','xml','mht','ini','js','html','backup','qry','config','json'] 
begin = time.time() 
flat(path) 
print('***********************************') 
for k in keys: 
    print(k) 
print('***********************************') 
insidefix(path, keys) 
end = time.time() 
dif = end-begin 
final = int(dif) 
runingtime(final) 

答えて

1

あなたの問題を分解してください。

トップダウンまたはボトムアップのいずれかを実行できます。私はボトムアップをお勧めします。

つまり、リーフディレクトリに降下し、すべてのファイル(1)をリストし、これらのファイルの名前を変更します。ステップアウトし、そのリーフディレクトリの名前を変更します。ステップアウト、...

コード:

def descend(path): 
    for item in list(os.scandir(path)): 
     if item.is_dir(): 
      descend(item.path) 
     if item.name != item.name.lower(): 
      os.rename(os.path.join(path, item.name), os.path.join(path, item.name.lower())) 

初期状態:

air:~ dima$ find testdir 
testdir 
testdir/lo.txt 
testdir/lower 
testdir/lower/lo1.txt 
testdir/lower/UP1.txt 
testdir/UP.txt 
testdir/UPper 

最終状態:

air:~ dima$ find testdir 
testdir 
testdir/lo.txt 
testdir/lower 
testdir/lower/lo1.txt 
testdir/lower/up1.txt 
testdir/up.txt 
testdir/upper 

(1)あなたは、事前にすべてのファイルを表示する必要があり、つまりlist(os.scandir(...))を読んでいる間はディレクトリを変更したくないためです。現代のオペレーティングシステムではそれは技術的に安全ですが、それは不思議な論理的バグにつながる可能性があります。ヒント:アイテムの名前を変更すると、ディレクトリ内のアイテムの順序が変わることがあります。

+0

素晴らしい解決策!私はPythonで新しくなったことを示しています...しかし、コードライン内の参照を新しいフォルダ名とファイル名に更新する必要があります。手作業で行うと、あまりにも多くのコードとあまりにも多くの参照を修正する必要があります。 – AlexanderFC

+0

コード内のビットにIDEを使用しようとしています。 'FOO.H - > foo.h;で作られたすべての名前を記録することができます。 SomeDir - > somedir'を使用してください。 'sed'をすべてのファイルに適用することができますが、C++で' 'を(' .h'なしで)持っていた場合や 's/FOO/foo /'をすべて置き換えた場合、 '#define FOO_MAX 123'の最初の単語 –

関連する問題