合并并小写目录和文件

合并并小写目录和文件

我有这样的目录

root/A/b/SomeFile.jpg
root/A/B/OtherFIle.jpg
root/a/D/yet_again.jpg

我想要这个

root/a/b/somefile.jpg
root/a/b/otherfile.jpg
root/a/d/yet_again.jpg

或者

other_root/a/b ...

我很高兴地假设没有发生碰撞。

我如何在 bash 或 python 脚本(或预先构建的用于对文件和目录进行排序的脚本)中执行此操作?

我想手工做,但是有成千上万个。

答案1

强制性的 zsh 解决方案:

for x in root/**/*(On); do mv -i $x ${x:h}/${x:t:l}; done

如果发生碰撞,这将要求确认。

解释:**表示所有(子)*目录,​​递归。(On)按字典顺序降序排序,因此目录总是出现在其内容之后。${x:h}表示的目录名称部分$x${x:t}表示其基本名称,并且:l转换为小写。

Bash 4 也许能够做到这一点,因为它有**,但我不知道它是否有相当于的(On)

答案2

这是一个非常具体的、非通用的解决这个问题的方法,我最多称之为“蛮力”。

import os
import re
import shutil

path = os.getcwd()
newpath = os.path.join(path,'..','newpics')
for item in os.listdir(path):
    path1 = os.path.join(path,item)
    if os.path.isdir(path1):
        for item_2 in os.listdir(path1):
            path2 = os.path.join(path1,item_2)
            for item_3 in os.listdir(path2):
                path3 = os.path.join(path2,item_3)
                item_lc = item.lower()
                item_2lc = item_2.lower()
                item_3lc = item_3.lower()
                pic_path = os.path.join(newpath,item_lc,item_2lc,item_3lc)
                print os.path.join(path,item,item_2,item_3)
                print pic_path
                try:
                    os.makedirs(os.path.join(newpath,item_lc,item_2lc))
                except OSError:
                    pass
                shutil.copyfile(path3,pic_path)

相关内容