ubuntuusers.de

Script zum Dateinamen umbenennen

Status: Gelöst | Ubuntu-Version: Ubuntu 20.04 (Focal Fossa)
Antworten |

gnude

Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 843

Hallo ich habe ein Verzeichnis mit mehreren Unterverzeichnissen in denen ich Dateien umbenennen möchte. Einige Dateien haben eine Klammer ( ) im Dateinamen und die möchte ich durch ein Minus-Zeichen - ersetzten lassen. Nun bin ich nicht fit in regulären ausdrücken aber kann mir denken das man dafür eine fixe Lösung findet. Hat jemand eine Idee?

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Wohnort: Göttingen

Das wäre wohl ein Job für rename.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11261

Wohnort: München

krename kann das z.B. recht nett für Leute, die sowas gerne mit einer GUI machen. In diesem PPA von mir steckt im Paket ein ein Patch, der verhindert, dass das Programm unsichtbar im Hintergrund weiterläuft, wenn man den Dialog zum Ersetzen schließt.

Ansonsten ist das z.B. mit Python3 schnell erledigt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/usr/bin/env python3
import pathlib
import sys

translation_table = str.maketrans('()', '--')

for directory in sys.argv[1:]:
    for entry in pathlib.Path(directory).rglob('*(*)*'):
        if not entry.is_file():
            continue
        new_name = entry.name.translate(translation_table)
        entry.rename(entry.parent / new_name)

Dem Skript kann man dann einfach das oder die gewünschten Verzeichnisse mitgeben, die rekursiv durchsucht werden sollen und wo '(' und ')' in Dateinamen durch Minus-Zeichen ersetzt werden sollen.

Oder geht es darum eine leere Klammer durch ein einzelnes Minus-Zeichen zu ersetzen? Das würde dann so aussehen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/usr/bin/env python3
import pathlib
import sys

for directory in sys.argv[1:]:
    for entry in pathlib.Path(directory).rglob('*(*)*'):
        if not entry.is_file():
            continue
        new_name = entry.name.replace('()', '-')
        entry.rename(entry.parent / new_name)

gnude

(Themenstarter)
Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 843

Leider klappt es nicht. Das Script erzeugt keine Fehlermeldung aber nen Dateiname ändert sich auch nicht....

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9731

Wohnort: Münster

gnude schrieb:

[…] regulären ausdrücken […]

Es geht mit Shell-Globs und Stringverarbeitung in der bash. In jedem Verzeichnis diesen Befehl ausführen:

for X in *\(* ; do mv "$X" "${X/\(/-}" ; done 

Eventuell das gleiche Spiel mit der schließenden Klammer wiederholen und natürlich muss man jedes Verzeichnis betreten. Das geht aber auch mit einem Skript.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13211

kB schrieb:

Eventuell das gleiche Spiel mit der schließenden Klammer wiederholen und natürlich muss man jedes Verzeichnis betreten. Das geht aber auch mit einem Skript.

Ungefähr so

1
2
3
4
5
find -type f -name '*(*)*' -exec sh -c '
for f; do
  mv "$f" "${f//\([^)]*\)/-}"
done
' -- {} +

Edit: das ersetzt Klammernpaare mit allem dazwischen durch einen Strich. Man könnte es auch komplett löschen. Was auch immer.

Antworten |