У меня есть каталог как это
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 ...
Я доволен предположением, что нет коллизий.
Как я мог сделать это в ударе или сценарии Python (или что-то предварительно созданное для сортировки файлов и каталогов)?
Я сделал бы вручную, но существуют тысячи из них.
Обязательное zsh решение:
for x in root/**/*(On); do mv -i $x ${x:h}/${x:t:l}; done
Это попросит подтверждение в случае коллизии.
Объяснение: **
средства весь (sub) *directories, рекурсивно. (On)
виды в уменьшении лексикографического порядка, так, чтобы каталоги всегда поднялись после их содержания. ${x:h}
означает часть имени каталога $x
, ${x:t}
означает его базовое имя, и :l
преобразовывает в нижний регистр.
Bash 4 смог делать это, так как это имеет **
, но я не знаю, имеет ли это эквивалент (On)
.
Вот очень определенный, необщий способ решить эту проблему, которую я назвал бы 'грубой силой' в лучшем случае
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)