我有这样的目录
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)