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