路径内文件夹内文件内的深度小写

Deep lowercase inside files inside folders inside a path

好的,就是这样,我一直在 Windows(不是我的)下做一个项目,最后他们决定在 Linux 上有一个功能齐全的分支,主要问题是原来的程序员编码时不考虑大小写,随意使用大写字母或小写字母打开和调用东西……疯了……对吧?好吧,我设法制作了一个 python3 脚本来平整所有案例以降低文件夹和文件的数量,但我仍然必须修复文件内的所有更改,这意味着要保留所有更改 "in memory" 并检查项目中的所有文件并更新每个文件。好吧,它或多或少地工作了 95%,仍然有很多未更正的文件……我的头现在找不到 "why",有什么建议吗?

#! /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) 在那里,重命名这些文件。走出去,重命名那个叶目录。走出去,...

代码:

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(...)) 因为你不想在阅读时修改目录。虽然这在现代操作系统上在技术上是安全的,但它可能会导致神秘的逻辑错误。提示:重命名项目时,目录中项目的顺序可能会发生变化。