Mehrfachumbenennung basierend auf benutzerspezifischer Tabelle/Variablen-Feldfunktion möglich?

German support forum

Moderators: white, Hacker, Stefan2

Post Reply
asc
Junior Member
Junior Member
Posts: 4
Joined: 2023-04-26, 10:59 UTC

Mehrfachumbenennung basierend auf benutzerspezifischer Tabelle/Variablen-Feldfunktion möglich?

Post by *asc »

Hallo allerseits

habe im Forum die ersten 10 Suchseiten zum Thema Mehrfachumbennennung durchgeblättert und zu meiner Frage nichts gefunden, daher hier als neuer Thread:

Gibt es eine Möglichkeit, variablen Inhalt einzufügen basierend auf erstens einem Teilstring des alten Dateinamens und zweitens dazu einer userseitig vorhandenen eineindeutigen Zuordnungstabelle?
Die Tabelle könnte etwa eine lokal gespeicherte Excel- oder CSV-Datei sein, random-Beispiel:

(links alter Wert)(rechts neuer Wert)
kbgP dYzJ
eLSE vJkT
LrSh MRsY
usw. usf.


Wenn im alten Dateinamen "eLSE" steht, soll also hiermit der String "vJkT" (als Ersatz oder Ergänzung) ausgegeben werden usw.
Ich hoffe ich habe mich verständlich ausgedrückt. Ich sehe eine Funktion "Namen aus Datei laden" im Umbenennungs-Fenster, diese gibt aber immer die Fehlermeldung, "Die Datei enthält die falsche Anzahl Zeilen", ich gehe daher davon aus dass hiermit nur eine einfache Liste eingelesen werden kann (mit exakt gleich vielen Elementen wie die im Tool angezeigte Liste) und kein variabler Inhalt gesucht und tabellarisch zugeordnet werden kann... Übersehe ich etwas? Oder gibt es eine Plugin-Funktion oder einen Workaround mit userspezifisch definierten Variablen usw?

Vielen Dank!
User avatar
Stefan2
Power Member
Power Member
Posts: 4133
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Re: Mehrfachumbenennung basierend auf benutzerspezifischer Tabelle/Variablen-Feldfunktion möglich?

Post by *Stefan2 »

Hi und willkommen asc

Die "Namen aus Datei laden"-Funktion ist eine 1:1-Beziehung für den kompletten Alt/Neu-Namen.

Für dein Anliegen würde man eher ein Skript verwenden, zB über den "den4b ReNamer" mit PascalScript



Das MUT vom TC ist dafür nicht ausgerüstet.

 
asc
Junior Member
Junior Member
Posts: 4
Joined: 2023-04-26, 10:59 UTC

Re: Mehrfachumbenennung basierend auf benutzerspezifischer Tabelle/Variablen-Feldfunktion möglich?

Post by *asc »

Ok dann weiß ich Bescheid. Nicht dringend, bisher habe ich "quick and dirty" die Basistabelle in Excel/LibreOffice mittels copy/paste von Befehlszeilen-Elementen (XCOPY, Parameter, Pfadangaben) umgemodelt in eine entsprechend langes Batch-Skript (.BAT). Suche nur beiläufig nach einer eleganteren Lösung.
User avatar
Hacker
Moderator
Moderator
Posts: 13052
Joined: 2003-02-06, 14:56 UTC
Location: Bratislava, Slovakia

Re: Mehrfachumbenennung basierend auf benutzerspezifischer Tabelle/Variablen-Feldfunktion möglich?

Post by *Hacker »

asc,
Geht es mit der einfachen Suchen und Ersetzen Funktion?

Code: Select all

Suchen nach:    kbgP|eLSE|LrSh|usw.
Ersetzen durch: dYzJ|vJkT|MRsY|usf.
Oder brauchst du den Text an einer anderen Stelle einfügen?

Roman
Mal angenommen, du drückst Strg+F, wählst die FTP-Verbindung (mit gespeichertem Passwort), klickst aber nicht auf Verbinden, sondern fällst tot um.
asc
Junior Member
Junior Member
Posts: 4
Joined: 2023-04-26, 10:59 UTC

Re: Mehrfachumbenennung basierend auf benutzerspezifischer Tabelle/Variablen-Feldfunktion möglich?

Post by *asc »

That's the power of logic! Danke. Und ich hatte wiedermal die Hilfe nicht genau gelesen, wo bereits steht dass die vertikale Trennlinie entsprechend verwendet werden kann..
Frage wäre für mich nur, wieviel passt wohl in die Suchen/Ersetzen-Textfelder rein (Anzahl Disjunktionsglieder und Zeichenlänge insgesamt). Meine Tabelle hat 3000-5000 Paare (je Glied bis zu 5 Zeichen).
P.S.: Ja ich würde eigentlich den neuen Wert gern an anderer Stelle hinzufügen, also den alten Wert auch drinbehalten.
User avatar
Stefan2
Power Member
Power Member
Posts: 4133
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Re: Mehrfachumbenennung basierend auf benutzerspezifischer Tabelle/Variablen-Feldfunktion möglich?

Post by *Stefan2 »

asc wrote: 2023-04-26, 11:20 UTC
(links alter Wert)(rechts neuer Wert)
kbgP dYzJ
eLSE vJkT
LrSh MRsY
usw. usf.


Geht es dir nur um die reine 1:1 Ersetzung von ~5000 Paaren?
Also,
- für jede Datei im Verzeichnis,
-- ersetzte alle AAA durch BBB
-- ersetzte alle CCCCC durch DDDDD
-- u.s.w.

?





Oder doch eher:
asc wrote: 2023-04-26, 11:20 UTC Gibt es eine Möglichkeit, variablen Inhalt einzufügen
basierend auf erstens einem Teilstring des alten Dateinamens
und zweitens dazu einer userseitig vorhandenen eineindeutigen Zuordnungstabelle?
Dann bräuchtest du/wir eine dreispaltige Tabelle:
||Teilstring || alt || neu ||

?



Kannst du ein paar (5-10) nahezu reelle Beispiele posten?




 
asc
Junior Member
Junior Member
Posts: 4
Joined: 2023-04-26, 10:59 UTC

Re: Mehrfachumbenennung basierend auf benutzerspezifischer Tabelle/Variablen-Feldfunktion möglich?

Post by *asc »

Ich bin nicht sicher ob ich die Frage richtig verstehe, aber ich denke: Ersteres ("Teilstring des Dateinamens" und "alter Wert in der Tabelle links" sind identisch).

reale Beispiele:
(NB: vorangestellte Listennummerierung gehört nicht zum Namen):

alte Dateinamen
  1. 3_Eml53.PDF
  2. 35_Eml54.PDF
  3. 129_Eml53.PDF
  4. 3001_Eml55.PDF
  5. 3003_Eml55.PDF
  6. 3004_Eml55.PDF
gewünschte neue Dateinamen
  1. finalerDateiname-Bezeichnung10002_Laufnummer3.PDF
  2. finalerDateiname-Bezeichnung10036_Laufnummer35.PDF
  3. finalerDateiname-Bezeichnung10150_Laufnummer129.PDF
  4. finalerDateiname-Bezeichnung14693_Laufnummer3001.PDF
  5. finalerDateiname-Bezeichnung14696_Laufnummer3003.PDF
  6. finalerDateiname-Bezeichnung14697_Laufnummer3004.PDF
Zuordnungstabelle
LAUFNUMMERBEZEICHNUNG
210001
310002
1110010
1210011
1310012
1410013
3510036
12910150
39310572
39510574
39610576
39710578
300114693
300314696
300414697
usw.usf.



P.S.:
Meine bisherige etwas umständliche Lösung ist die 3000 Zeilen lange Zuordnungstabelle jedesmal im Tabellenkalkulationsprogramm folgendermaßen umzumodeln.
  • Spalte 1steht 3000 mal runterkopiert:

    Code: Select all

    echo d | Xcopy "..\OriginalPDFs\
  • Sp. 2 steht
    der jew. Inhalt der Spalte LAUFNUMMER
  • Sp. 3 steht 3000mal

    Code: Select all

    _Eml*.pdf" "..\PDFsToSend\finalerDateiname-Bezeichnung
  • Sp. 4 steht
    der jew. Inhalt der Spalte BEZEICHNUNG
  • Sp. 5 steht 3000 mal

    Code: Select all

    _Laufnummer
  • Sp. 6 steht wieder
    der jew. Inhalt der Spalte LAUFNUMMER
  • Sp. 7 steht 3000 mal

    Code: Select all

    .pdf" /VFK >> umbenennungsprotokoll.txt

(Das jedem Kopierbefehl vorangestellte „echo d“ soll übrigens die von XCOPY automatisch getätigte Abfrage abtun, ob das jeweilige Ziel Datei oder Verzeichnis sei.)
Dann das ganze Sheet in einen Texteditor kopieren, die Spaltenwechsel als Tabulatoren automatisch ersetzen lassen und als plaintext-basierte Datei „umbenennungsskript.bat“ speichern.
Danke bis hierher schonmal für den Versuch sich hineinzutüfteln!
User avatar
Stefan2
Power Member
Power Member
Posts: 4133
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Re: Mehrfachumbenennung basierend auf benutzerspezifischer Tabelle/Variablen-Feldfunktion möglich?

Post by *Stefan2 »

Also
- für jede LAUFNUMMER(x)
- - durchsuche den Ordner nach Dateien mit der LAUFNUMMER(x) + Unterstrich am Dateianfang
- - - benenne die gefundene Datei um in "finalerDateiname-Bezeichnung"+ BEZEICHNUNG(x) +"_Laufnummer" + LAUFNUMMER(x)

?


Das können dir hier einige als Skript (PowerShell, AutoHotkey, VBS/JS) bereitstellen ...



Oh, du hast deinen Post editiert,.... muss ich nochmal lesen....


 
User avatar
ZoSTeR
Power Member
Power Member
Posts: 1008
Joined: 2004-07-29, 11:00 UTC

Re: Mehrfachumbenennung basierend auf benutzerspezifischer Tabelle/Variablen-Feldfunktion möglich?

Post by *ZoSTeR »

 
Hier nen simples PowerShell-Skript zum Start:

- CSV-Datei erstellen als "Alt-Neu.csv" mit den gleichnamigen Spalten zur String-Ersetzung
- Skript speichern als "Multi-Rename.ps1" und den "workFolder"-Pfad anpassen

Code: Select all

$csvFile = "$PSScriptRoot\Alt-Neu.csv"

$workFolder = "D:\Test Files"

$renameCMD = "$PSScriptRoot\Rename-All.cmd"

$csvAll = Import-Csv -LiteralPath $csvFile -Delimiter ";" -Encoding Default

$allFiles = Get-ChildItem -LiteralPath $workFolder -Recurse -File

foreach ($file in $allFiles)
{
    $newFileName = $file.Name

    foreach($csvItem in $csvAll)
    {
        $newFileName = $newFileName.Replace($($csvItem.Alt), $($csvItem.Neu))
    }

    # CMD-File schreiben
    Add-Content -LiteralPath $renameCMD -Value "ren `"$($file.FullName)`" `"$newFileName`""
    
    # Datei umbenennen / nach Test "-WhatIf" entfernen
    Rename-Item -LiteralPath $file.FullName -NewName $newFileName -WhatIf
}
- CSV und Skript im selben Ordner speichern
- Im PowerShell-ISE öffen und mit F5 starten

Das Skript ersetzt in jeder Datei im "workFolder" sämtliche CSV-Einträge von "Alt" auf "Neu", dies rekursiv, dh auch für Unterordner.
Es wird sowohl eine Rename-All.cmd (bat) Datei zur händischen Weiterbearbeitung erstellt, als auch die jeweilige Datei umbenannt, nachdem das "-whatif" entfernt wird (siehe Kommentare)

*Edit:

Nach mehrmaligem Durchlesen deines letzten Posts sehe ich, daß das Skript nicht wirklich passt...

Die Dateinamenstruktur ist wirklich immer "ZAHL_Eml*.pdf"? Dann müsste man besser mit RegEx arbeiten, aber dafür muss die Nomenklatur klar abbildbar sein... oder man baut "stumpf" automatisiert die Batch-Befehle anhand der CSV zusammen.
Last edited by ZoSTeR on 2023-04-26, 20:11 UTC, edited 2 times in total.
User avatar
ZoSTeR
Power Member
Power Member
Posts: 1008
Joined: 2004-07-29, 11:00 UTC

Re: Mehrfachumbenennung basierend auf benutzerspezifischer Tabelle/Variablen-Feldfunktion möglich?

Post by *ZoSTeR »

 
Hier noch nen Skript das eher passen sollte:

Code: Select all

$csvFile = "$PSScriptRoot\LAUFNUMMER-BEZEICHNUNG.csv"

$workFolder = "D:\Test Files"

$renameCMD = "$PSScriptRoot\Rename-All.cmd"

$csvAll = Import-Csv -LiteralPath $csvFile -Delimiter ";" -Encoding Default

foreach ($csvItem in $csvAll)
{
    $checkPath = Join-Path -Path $workFolder -ChildPath "$($csvItem.LAUFNUMMER)_Eml*.pdf"

    if (Test-Path -Path $checkPath -PathType Leaf)
    {
        # Durch die Wildcard können mehrere Dateien matchen... es wird nur die erste gefundene Datei bearbeitet
        $fileItems = Get-Item -Path $checkPath
        $fileItem = $fileItems[0]
        
        $newFileName = "finalerDateiname-Bezeichnung" + $csvItem.BEZEICHNUNG + "_Laufnummer" + $csvItem.LAUFNUMMER + ".PDF"

        # CMD-File schreiben
        Add-Content -LiteralPath $renameCMD -Value "ren `"$($fileItem.FullName)`" `"$newFileName`""
    
        # Datei umbenennen / nach Test "-WhatIf" entfernen
        Rename-Item -LiteralPath $fileItem.FullName -NewName $newFileName -WhatIf
    }
}
Es werden alle Laufnummern aus der CSV durchgegangen und bei einer passenden Datei ein neuer Name erstellt.
Post Reply