Shell: Einfügen von Zeichen in einem Dateinamen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Sigi44

Shell: Einfügen von Zeichen in einem Dateinamen

Beitrag von Sigi44 » 11.12.2005 12:19:12

Hallo,

wer hat eine elegante Lösung für die bash für folgende Aufgabe der Behandlung eines Dateinamens:

1. Prüfe, ob der Dateiname das Muster "123" enthält.
2. Wenn ja, Abbruch. Wenn nein, füge vor dem letzten Vorkommen eines "." im Dateinamen ".123" ein.
3. Enthält der Dateiname kein ".", hänge ".123" an den Dateinamen an.

Würde mich freuen, wenn jemand ne Lösung parat hätte!

Benutzeravatar
C_A
Beiträge: 1082
Registriert: 22.04.2004 14:51:01
Lizenz eigener Beiträge: GNU General Public License

Beitrag von C_A » 11.12.2005 20:54:12

Ich hab jetzt soweit ein kleines script gebastelt, nur bei:
Wenn nein, füge vor dem letzten Vorkommen eines "." im Dateinamen ".123" ein.
Bin ich mir nicht ganz sicher ob ich dich soweit richtig verstanden habe.

Soll das zB so aussehen?
textfile.txt -> textfile.123.txt
sehr.tolles.file -> sehr.tolles.123.file
sehr.sehr.tolles.file -> sehr.sehr.tolles.123.file

Wenn es nur so was wie in der ersten Zeile wäre, hätt ich das ;)

Sigi44

Beitrag von Sigi44 » 11.12.2005 23:02:39

Habe nun doch ein Pythonskript gebastelt, was den Zweck erfüllt, mit noch ein paar Extras. Ich möchte es benützen, um die Namen mit aMule fertig heruntergeladener Dateien mit deren eD2k-Prüfsumme zu versehen, damit man später leicht überprüfen kann, ob die Datei noch "original" ist (die ersten 14 Stellen der Prüfsumme reichen mir dafür aus).

Trotzdem wäre ich interessiert, wie ihr das lösen würdet. Mit was programmiert ihr so?

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

# ed2kettiere
# Version: 15.12.2005
# Fügt "ED2K-" plus die ersten 14 Ziffern des ED2K-Hashes plus "."
# vor dem letzten "." im Dateinamen ein (wenn kein "." im Dateinamen,
# wird o.g. angehängt)

# Parameter:
# was soll vor dem eigentlichen Hash stehen?
hash_prefix=".ED2K-"

# auf wieviel Stellen soll der Hash gekürzt werden?
hash_laenge=14

# für Befehlszeilenparameter:
import sys

# für Shell-Kommando:
import os

befehlsargumente=sys.argv

progname=os.path.basename(befehlsargumente[0])

# genau zwei Parameter übergeben?
if len(befehlsargumente) !=3:
        print
        print progname+" - Skript zum ED2Kettieren"
        print
        print "Syntax: "+progname+" <Dateiname> <Hash>"
        print
        sys.exit(1)

# der komplette Dateipfad:
pfad=befehlsargumente[1]

# nur der Ordnerpfad:
ordner=os.path.dirname(pfad)

# nur der Dateiname:
datei=os.path.basename(pfad)

# der Hashwert:
hash=befehlsargumente[2]

# Der Hash wird auf die ersten <haesh_laenge> Stellen gekürzt:
hash_gekuerzt=hash[:hash_laenge]

# Der komplette Hash-Anhang:
hash_anhang=hash_prefix+hash_gekuerzt

# Ist der gekürzte Hash bereits im Dateinamen enthalten?
if datei.find(hash_gekuerzt) != -1:
        print "Die Datei \""+pfad+"\" enthält die (Teil-)Prüfsumme \""+hash_gekuerzt+"\" bereits."
        sys.exit(1)

# Position des letzten Punktes im Dateinamen:
letzter_punkt=datei.rfind(".")

# gar kein Punkt im Dateinamen?
if letzter_punkt == -1:
        # dann Hash hinten ranhängen
        pfad_neu=pfad+hash_anhang
else:
        # oder Hash in Dateinamen einfügen
        datei_neu=list(datei)
        datei_neu.insert(letzter_punkt,hash_anhang)
        datei_neu="".join(datei_neu)
        # ordner endet nicht mit /, daher:
        pfad_neu=os.path.join(ordner,datei_neu)

print "Alter Dateiname: ",pfad
print "Neuer Dateiname: ",pfad_neu

os.rename(pfad,pfad_neu)

Antworten