1

У меня есть такой каталог

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 (или что-то заранее подготовленное для сортировки файлов и каталогов)?

Я бы сделал вручную, но их тысячи.

2 ответа2

1

Обязательное зш решение:

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) .

0

Вот очень специфический, не общий способ решения этой проблемы, который я бы назвал в лучшем случае «грубой силой».

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)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .