Unisci e minuscole directory e file


1

Ho una directory come questa

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

E vorrei questo

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

O

other_root/a/b ...

Sono contento di presumere che non ci siano collisioni.

Come potrei farlo in uno script bash o python (o qualcosa di pre-costruito per ordinare file e directory)?

Lo farei a mano, ma ce ne sono migliaia.

Risposte:


1

Soluzione zsh obbligatoria:

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

Ciò richiederà conferma in caso di collisione.

Spiegazione: **indica tutte le (sotto) * directory, ricorsivamente. (On)ordina in ordine lessicografico decrescente, in modo che le directory vengano sempre visualizzate dopo il loro contenuto. ${x:h}indica la parte del nome della directory $x, ${x:t}indica il nome di base e la :lconversione in minuscolo.

Bash 4 potrebbe essere in grado di farlo, dal momento che ha **, ma non so se ha un equivalente di (On).


Wow, cool one-(ish) liner. Ma due (o uno e mezzo) problemi. 1) l'OP vuole normalizzare anche i nomi delle directory. Non so zsh ma presumo: mv -i $x ${x:h:l}/${x:t:l}funzionerebbe. E a questo punto, potrebbe essere necessario creare i sottodir. [ ! -d ${x:h:l} ] && mkdir -p ${x:h:l}
Rich Homolka,

@Rich: **/*(On)corrisponde anche alle directory, quindi verranno ridimensionate. E a causa di ciò (On), le directory vengono ridimensionate dopo il loro contenuto, motivo per cui il mvcomando è attento a non minuscolare la parte della directory.
Gilles,

0

Ecco un modo molto specifico e non generale per risolvere questo problema, che definirei al massimo "forza bruta".

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.