2016-06-22 18 views
2

Ok, das ist die Sache, ich habe an einem Projekt unter Windows gearbeitet (nicht meiner) und schließlich beschlossen, eine voll funktionsfähige Fork unter Linux zu haben, das Hauptproblem ist das die ursprünglichen Programmierer codierten die Fälle ohne Widerhaken, öffneten und riefen Dinge mit Hilfe von Großbuchstaben oder Kleinbuchstaben nach Belieben ... verrückt ... oder? Nun, ich habe es geschafft, ein Python3-Skript zu erstellen, um alle Fälle in Ordner und Dateien zu reduzieren, aber ich musste immer noch alle Änderungen in den Dateien korrigieren, es bedeutet, alle Änderungen "im Speicher" zu behalten und alle zu überprüfen Dateien innerhalb des Projekts und aktualisieren sie jeweils. Nun, es funktionierte 95% mehr oder weniger, hat immer noch eine Menge unkorrigierter Dateien ... mein Kopf kann das "Warum" in diesem Moment nicht finden, irgendwelche Vorschläge?Tiefe Kleinbuchstaben innerhalb von Dateien innerhalb von Ordnern in einem Pfad

#! /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) 

Antwort

1

Bitte zersetzen Ihr Problem.

Sie können entweder von oben nach unten oder von unten nach oben gehen. Ich empfehle Bottom-Up.

Das heißt, in Blattverzeichnis absteigen, Liste alle Dateien (1) dort, benennen Sie diese Dateien um. Austreten, dieses Blattverzeichnis umbenennen. Step out, ...

Code:

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())) 

Ausgangszustand:

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

Endzustand:

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

(1) Sie alle Dateien im Voraus Liste sollte, dh list(os.scandir(...)), weil Sie das Verzeichnis nicht ändern möchten, während Sie es lesen. Während dies auf modernen Betriebssystemen technisch sicher ist, kann es zu mysteriösen logischen Fehlern führen. Tipp: Die Reihenfolge der Elemente in einem Verzeichnis kann sich ändern, wenn Sie ein Element umbenennen.

+0

Brilliante Lösung! ... es zeigt mir, dass ich nur neu in Python bin ... Aber ich muss immer noch die Referenzen innerhalb der Codezeilen (auf die neuen Ordnernamen und Dateinamen) aktualisieren, kann nicht sein Von Hand gemacht, gibt es zu viel Code und zu viele Referenzen, die behoben werden müssen. – AlexanderFC

+0

Ich würde versuchen, eine IDE für Bits innerhalb des Codes zu verwenden. Sie können alle Umbenennungen aufzeichnen, die 'FOO.H -> foo.h; SomeDir -> Somedir' und dann z. 'sed' auf all Ihren Dateien, aber es kann auch fehlschlagen, was ist, wenn es C++ ist und 'include ' (ohne '.h') hat oder wenn Sie alle' s/FOO/foo/'ersetzen, ist es leicht versehentlich zu ersetzen erstes Wort in '#define FOO_MAX 123' –