Portál AbcLinuxu, 9. května 2025 20:45

Dotaz: rename v debian rekurzivne

23.8.2006 22:57 kanon | skóre: 8 | blog: dist
rename v debian rekurzivne
Přečteno: 249×
Odpovědět | Admin
ahoj

prosim vas za boha nemuzu prijit na to jak u debianiho prikazu rename nastavit rekuzrivne i pro podadresare a soubory.

dekuju predem
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

23.8.2006 23:05 hondza
Rozbalit Rozbalit vše Re: rename v debian rekurzivne
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ahoj.

Zkusil bych find:

find dir [...podminky...] -print0 | sort -zr | xargs -0 rename '...regexp...'
24.8.2006 09:26 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: rename v debian rekurzivne
Odpovědět | | Sbalit | Link | Blokovat | Admin
Při rekurzívním přejmenovávání adresářů je potřeba dát pozor na to, aby se nejprve zpracoval obsah adresáře, a pak teprve se přejmenoval jeho vlastní název. Jinak se stane, že jeho obsah takříkajíc "zmizí pod rukama".
Zkrátka je potřeba procházet strom zdola nahoru. Nebo shora dolů. No prostě něco v tom smyslu ;-)
Mám vyzkoušeno tohle:
#!/usr/bin/env python
import os, sys

try:
    rename_flag = sys.argv[1] == '--rename'
except IndexError:
    rename_flag = False

def suggest_new_name(name):
    try:
        newname = name.decode('utf-8').encode('iso-8859-2')
        #newname = name.decode('iso-8859-2').encode('utf-8')
    except UnicodeDecodeError:
        return False
    except UnicodeEncodeError:
        return False

    if newname == name:
        return False #No renaming necesarry
    return newname

def rename_path(oldpath, newpath):
    print oldpath, '->', newpath
    if rename_flag:
        os.rename(oldpath, newpath)

def process_names(root, names):
    for name in names:
        newname = suggest_new_name(name)
        if not newname: continue
        fullpath_old = os.path.join(root, name)
        fullpath_new = os.path.join(root, newname)
        rename_path(fullpath_old, fullpath_new)

for root, dirs, files in os.walk('.', topdown=False):
        process_names(root, files)
        process_names(root, dirs)
Program projde vše rekurzivně v aktuálním adresáři a přejmenuje názvy z utf-8 do latin2, pokud takovou konverzi lze provést. Bez parametru '--rename' běží nanečisto - pouze vypíše, co by udělal.
Tu konverzní funkci (suggest_new_name) si můžeš přepsat na cokoli tě napadne.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.