Birleştir ve küçük harf Dizinler ve FIles


1

Bunun gibi bir rehberim var

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

Ve bunu istiyorum

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

VEYA

other_root/a/b ...

Çarpışma olmadığını varsaydığım için mutluyum.

Bunu bir bash veya python betiğinde (veya dosyaları ve dizinleri sıralamak için önceden oluşturulmuş bir şeyde) nasıl yapabilirim?

Elle yapardım, ama onlardan binlerce var.

Yanıtlar:


1

Zorunlu zsh çözümü:

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

Bu çarpışma durumunda onay isteyecektir.

Açıklama: ** yinelemeli olarak tüm (alt) * dizinleri ifade eder. (On) sözlüklerin sıralamasını azaltarak sıralar; böylece dizinler her zaman içeriklerinden sonra gelir. ${x:h} dizinin adı $x, ${x:t} temel adı ve :l küçük harfe dönüştürür.

Bash 4 olduğundan, yapabilir **, ancak bunun bir eşdeğeri olup olmadığını bilmiyorum (On).


Vay be, bir (ish) astarı soğut. Ancak iki (veya bir buçuk) sorun var. 1) OP, dizin adlarını da normalleştirmek istiyor. Bilmiyorum zsh ama sanırım: mv -i $x ${x:h:l}/${x:t:l} işe yarardı. Ve bu noktada, alt dizinleri oluşturmanız gerekebilir. [ ! -d ${x:h:l} ] && mkdir -p ${x:h:l}
Rich Homolka

@Zengin: **/*(On) aynı zamanda dizinleri de eşleştirir, bu yüzden onlar aşağıya çekilir. Ve yüzünden (On), dizinler sonra içerikleri, bu yüzden mv komut dikkatli değil dizin bölümünü küçük harf yapmak için.
Gilles

0

İşte bu problemi çözmek için en iyi şekilde 'kaba kuvvet' olarak adlandırdığım çok spesifik, genel olmayan bir yol.

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.