1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

umbenennen von Ordnern nach Dateinamen

Dieses Thema im Forum "CGI, Perl, Python, Ruby, Power Shell" wurde erstellt von BodenseepiratKN, 5. August 2017.

  1. BodenseepiratKN

    BodenseepiratKN Grünschnabel

    Hallo!
    Ich hjabe jetzt schon einige Tage (!) damit verbracht eine Lösung für mein Problem zu finden. Ich such mir dabei nen Wolf *g*
    Ich habe folgendes Problem:
    mehrere Ordner, mit jeweils nur einer Datei.
    Ich möchte mit einer Batch, falls möglich jeden entsprechenden Ordner mit dem Namen der darin enthaltenen Datei umbenennen.
    Beispiel:
    Neuer Ordner 1 hat den Inhalt Beispiel 1.txt
    Neuer Ordner 2 hat den Inhalt Beispiel 2.txt
    usw.
    Da das weit über 500 Ordner sind wäre es eine Mammut Aufgabe jeden Ordner manuell umzubenennen.

    Hat wer eine Idee?

    Mein Dank wird Euch auf ewig nachschleichen :-D
     
  2. Technipion

    Technipion Erfahrenes Mitglied

    Hallo BodenseepiratKN,
    leider ist deine Frage nicht ganz vollständig. Sagen wir einmal in deiner Ausgangssituation hast du folgende Dateien:
    "Ordner 1" mit Inhalt "Datei 1.dat"
    "Ordner 2" mit Inhalt "Datei 2.dat"
    "Ordner x" mit Inhalt "Datei x.dat"

    Jeder Ordner enthält nur eine Datei.
    Okay, jetzt ist die Frage: Nach welchem Schema möchtest du die Ordner umbenennen?
    Möchtest du z.B. nur ein Präfix hinzufügen? Sodass z.B. folgendes rauskommt:
    "Präfix Ordner 1" mit Inhalt "Datei 1.dat"
    ...

    Oder soll die Umbenennung etwas mit den Dateien innerhalb der Ordner zu tun haben?

    Gruß Technipion

    PS: Prinzipiell kann man in Bash Ordner umbennen, indem man sie rekursiv zu einem anderen Ort verschiebt. In der Praxis besser ist allerdings sie zu kopieren, und die Originale erst dann zu löschen.
     
  3. BodenseepiratKN

    BodenseepiratKN Grünschnabel

    Danke für die schnelle Antwort.
    Die Ordner sollen gemäß der darin enthaltenen Datei umbenannt werden.
    Also aus Neuer Ordner 1 (in dem sich Beispiel 1.txt befindet), soll in "Beispiel1" umbenannt werden...
     
  4. Technipion

    Technipion Erfahrenes Mitglied

    Hallo BodenseepiratKN,
    bei mir steht es zeitlich im Moment leider sehr knapp. Ich habe dir schnell ein Bash-Skript gebastelt, das deine Aufgabe (zumindest so wie ich es verstanden habe) erledigt. Du wirst wahrscheinlich zu der ein oder anderen Zeile Fragen haben (was sehr gut ist, so lernt man schließlich!), stelle sie einfach hier im Forum. Auch wenn ich die nächsten Tage nicht antworten kann, werden dir viele andere Mitglieder mit Sicherheit gerne behilflich sein ;).

    Hier ist der Code:
    Code (Text):
    1. #!/bin/bash
    2.  
    3. OIFS="$IFS"
    4. IFS=$'\n'
    5.  
    6. for folderName in $(ls -d */);
    7.   do
    8.     cd "$folderName"
    9.     fileName=`ls`
    10.     cd ..
    11.     fileNameWithoutExtension=${fileName%%.*}
    12.     mv "$folderName" "$fileNameWithoutExtension";
    13. done

    Du kannst das Skript über $ bash rename.sh ausführen, oder es ausführbar machen und dann einfach $ ./rename.sh eintippen. Die Datei muss in dem Ordner liegen, in dem auch deine 500 umzubenennende Ordner liegen.

    Gruß Technipion
     
  5. BodenseepiratKN

    BodenseepiratKN Grünschnabel

    oha!
    Nun ich habe nicht erwartet das die Windows Powershell sich so stark von der "normalen" Stapelverarbeitung unterscheiddet. und nur mit batch Dateien kann ich gerade so arbeiten UND verstehn.
    Dein Code funktioniert so nicht und ich kann nicht mal sagen warum (ich versteh nicht eine Zeile)
    Ich bekomme eine Fehlermeldung, als ich die bash in einem Probeordner (mit nur 9 Ordnern und einer Datei Inhalt) ausprobierte bekam ich die Meldung
     

    Anhänge:

  6. sheel

    sheel I love Asm Administrator

    Hi

    Bash ist nicht Powershell, sondern (ursprünglich) eine Linux-Shell (von der es inzwischen auch ein paar eingeschränkte Varianten gibt, die man auf Windows installieren kann). Kein Wunder dass es nicht so direkt funktioniert.

    (Der Name ist keine Abwandlung von Batch, sondern vom Vorgänger "Bourne-Shell": Bourne-Again-SHell)
     
  7. BodenseepiratKN

    BodenseepiratKN Grünschnabel

    Dann bin ich vermutlich im falschen
    Forum? :confused:
     
  8. sheel

    sheel I love Asm Administrator

    Das Forum ist schon ok; nur haben Technipion und du wohl verschiedene Vorstellungen was eigentlich gemacht werden soll...

    hab selber mit Windows-Batch leider kaum was zu tun, aber evt. schaff ich es morgen, etwas funktionierendes zusammenzustellen...
     
  9. BodenseepiratKN

    BodenseepiratKN Grünschnabel

    Sorry fürs warten ;)
    Was mach ich nu? Könnte der Admin diesen Thread ins richtige Forum verschieben? Schätze ich bin hier falsch...
     
  10. Technipion

    Technipion Erfahrenes Mitglied

    Ohhhhhh man. Jetzt komme ich gerade aus dem Urlaub zurück, und erst jetzt sehe ich, dass ich in deinem ersten Beitrag versehentlich "Bash" statt "Batch" gelesen habe BodenseepiratKN. Tut mir leid, das war mein Fehler :oops:...

    Mit Batch kenne ich mich leider nicht wirklich aus. Ich kann die Basics, aber Skripte schreiben ist mir zu hoch. Ich meine aber, dass man ab Windows 10 auch Bash zur Verfügung hat. Da ich kein Win10 habe, kann ich jedoch nicht überprüfen ob das Bash-Skript ordnungsgemäß arbeitet.

    Ich habe dir ein kleines Skript in Python gebastelt, das die Ordner umbenennt. Python ist sowieso eine gute Anlaufstelle für das Schreiben kleinerer Hilfsprogramme. Und es ist nicht schwer zu installieren - https://www.python.org/.

    Code (Python):
    1. import os
    2. from os.path import isfile, join, basename, splitext
    3.  
    4.  
    5. def main():
    6.  
    7.     cwd = os.getcwd()
    8.  
    9.     def getFilename(files):
    10.         return splitext(basename(files[0]))[0]
    11.  
    12.     for folder in listFolders(cwd):
    13.  
    14.         files = [join(folder, i) for i in os.listdir(folder)]
    15.  
    16.         if not filesAreGood(files): break
    17.  
    18.         new_folder_name = getFilename(files)
    19.         os.rename(folder, join(cwd, new_folder_name))
    20.  
    21.     return 0
    22.  
    23.  
    24. def listFolders(cwd):
    25.  
    26.     folders = [x[0] for x in os.walk(cwd)]
    27.     folders.remove(cwd)
    28.  
    29.     return folders
    30.  
    31.  
    32. def filesAreGood(files):
    33.  
    34.     if len(files) != 1:
    35.         print('WARNING: {} contains not exaclty 1 file!'.format(folder))
    36.         return False
    37.  
    38.     if not isfile(files[0]):
    39.         print('WARNING: {} contains a subfolder!'.format(folder))
    40.         return False
    41.  
    42.     return True
    43.  
    44.  
    45. if __name__ == '__main__':
    46.     main()

    Falls du Fragen zum Code hast, werde ich sie dir gerne beantworten ;).

    Gruß Technipion
     
  11. Biber3

    Biber3 Erfahrenes Mitglied

    Mon BodenseepiratKN,

    dafür brauchst du nicht mal einen Batch, du kannst es direkt als ein Kommando vom CMD-Prompt absetzen.

    Öffne dafür einen CMD-Prompt ("Ausführen->" cmd), w[echsele auf Laufwerk+Pfad, unterhalb dem die Ordner sind (die "Neuer Ordner x" in deinem Beispiel) und gib ein bzw. kopiere:

    Code (Text):
    1. for /d %i in ("neu*") do @for %j in ("%i\*.txt") do @echo ren "%~pj" "%~nj"
    und bestätige mit ENTER.
    Daraufhin siehst du, was passieren WÜRDE (nichts wird umbenannt, ist nur Vorschau)
    Code (Text):
    1. ren "\Users\Biber\Neuer Ordner1\" "beispiel 1"
    2. ren "\Users\Biber\Neuer Ordner2\" "beispiel 2"
    3. ren "\Users\Biber\Neuer Ordner3\" "beispiel x"
    Wenn das angezeigt wird, was auch deinen Erwartungen entspricht, dann schicke die oben gepostete Zeile ab OHNE die 5 Zeichen "@Echo",
    Dann wird tatsächlich umbenamst.

    Anmerkung:
    - die CMD-Zeile führt nichts rekursiv aus (keine Unterordnerstruktur, sondern nur eine Ebene unterhalb Startverszeichnis. Mehr war nicht verlangt.
    - in jedem Unterordner wird nur EINE *.txt-Datei erwartet. Sind mehrere da, dann wird umbenannt in den ersten gefundenen Dateinamen, alle weiteren vorhandenen Dateien führen zu einer Fehlermeldung ("Ordner kann nicht umbenannt werden, weil.. isser ja schon"). Ist keine *.txt-Datei vorhanden, wird natürlich nix umbenannt.

    Grüße
    Biber