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

时间:2016-06-22 14:42:13

标签: python linux file directory lowercase

好的,这就是问题,我一直在研究Windows下的一个项目(不是我的),最后他们决定在Linux上有一个功能齐全的分支,主要的问题是原始程序员编码无情的情况下,打开并使用upercase o小写随意调用...疯狂......对吗?好吧,我设法生成一个python3脚本来平坦所有案例以降低文件夹和文件,但我仍然必须修复文件中的所有更改,这意味着要保持所有更改并且#34;在内存中#34 ;并检查项目中的所有文件并更新每个文件。嗯,它或多或少地工作了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 个答案:

答案 0 :(得分:1)

请分解你的问题。

您可以自上而下或自下而上。我推荐自下而上。

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