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