• Windows 版

# encoding: utf-8
# author: walker
# date: 2014-03-07
# summary: 深度遍历指定目录,并将子目录和文件名改为小写
# 注意,此程序只针对windows,windows下文件(夹)名不区分大小写

import os
import time

StartTime = time.time()

# 需要处理目录的绝对路径
FileRoot = r'D:\test'

def Main():
    # 先修改文件名
    for parent, dirnames, filenames in os.walk(FileRoot):
        for filename in filenames:
            srcFile = os.path.join(parent, filename)
            dstFile = os.path.join(parent, filename.lower())
            if srcFile == dstFile:   # 如果文件名本身就是全小写
                continue
            print('%s -> %s' % (srcFile, dstFile))
            os.rename(srcFile, dstFile)

    # 后修改目录名,这里注意topdown参数。
    # topdown决定遍历的顺序,
    # 如果topdown为True,则先列举top下的目录,然后是目录的目录,依次类推;
    # 反之,则先递归列举出最深层的子目录,然后是其兄弟目录,然后父目录。
    # 我们需要先修改深层的子目录
    for parent, dirnames, filenames in os.walk(FileRoot, topdown=False):
        for dirname in dirnames:
            srcDir = os.path.join(parent, dirname)
            dstDir = os.path.join(parent, dirname.lower())
            if srcDir == dstDir: 	# 如果文件夹名本身就是全小写
                continue
            print('%s -> %s' % (srcDir, dstDir))
            os.rename(srcDir, dstDir)

if __name__ == '__main__':
    Main()
    print('Time total: %.2fs' % (time.time() - StartTime))
    print('Current time: %s' % time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))


  • Linux 版

# encoding: utf-8
# author: walker
# date: 2018-09-12
# summary: 深度遍历指定目录,并将子目录和文件名改为小写
# 如果目录或文件名冲突,直接覆盖
# 注意,此程序只针对 Linux 设计,其他操作系统是否适用未知

import os
import time
import shutil

StartTime = time.time()

# 需要处理目录的绝对路径
FileRoot = r'/home/walker/test'

def Main():
    # 先修改文件名
    for parent, dirnames, filenames in os.walk(FileRoot):
        for filename in filenames:
            srcFile = os.path.join(parent, filename)
            dstFile = os.path.join(parent, filename.lower())
            if srcFile == dstFile:   # 如果文件名本身就是全小写
                continue
            print('%s -> %s' % (srcFile, dstFile))
            shutil.copyfile(srcFile, dstFile)   # 目标文件会被覆盖

    # 后修改目录名,这里注意topdown参数。
    # topdown决定遍历的顺序,
    # 如果topdown为True,则先列举top下的目录,然后是目录的目录,依次类推;
    # 反之,则先递归列举出最深层的子目录,然后是其兄弟目录,然后父目录。
    # 我们需要先修改深层的子目录
    for parent, dirnames, filenames in os.walk(FileRoot, topdown=False):
        for dirname in dirnames:
            srcDir = os.path.join(parent, dirname)
            dstDir = os.path.join(parent, dirname.lower())
            if srcDir == dstDir: 	# 如果文件夹名本身就是全小写
                continue
            print('%s -> %s' % (srcDir, dstDir))
            if not os.path.exists(dstDir):  # 目标目录不存在,直接改名
                os.rename(srcDir, dstDir)
            else:
                # 目标目录不存在,先拷贝创建硬链接,再删除源文件
                # -f, --force
                # -r, --recursive
                # -l, --link, hard link files instead of copying
                cmd = r'cp -frl %s/* %s' % (srcDir, dstDir)
                print('cmd: %s' % cmd)
                os.system(cmd)
                cmd = r'rm -rf %s' % srcDir
                print('cmd: %s' % cmd)
                os.system(cmd)

if __name__ == '__main__':
    Main()
    print('Time total: %.2fs' % (time.time() - StartTime))
    print('Current time: %s' % time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))


  • Windows 版本和 Linux 版本的主要区别再重命名目录时,Windows 下不可能存在同名大小写不一致的目录。


相关阅读:

1、Python文件(夹)基本操作

2、os.scandir()


*** walker ***