umbenennen von Ordnern nach Dateinamen


#1
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
 

Technipion

Erfahrenes Mitglied
#2
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
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...
 

Technipion

Erfahrenes Mitglied
#4
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:
#!/bin/bash

OIFS="$IFS"
IFS=$'\n'

for folderName in $(ls -d */);
  do
    cd "$folderName"
    fileName=`ls`
    cd ..
    fileNameWithoutExtension=${fileName%%.*}
    mv "$folderName" "$fileNameWithoutExtension";
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
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
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)
 
#8
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...
 

Technipion

Erfahrenes Mitglied
#10
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/.

Python:
import os
from os.path import isfile, join, basename, splitext


def main():

    cwd = os.getcwd()

    def getFilename(files):
        return splitext(basename(files[0]))[0]

    for folder in listFolders(cwd):

        files = [join(folder, i) for i in os.listdir(folder)]

        if not filesAreGood(files): break

        new_folder_name = getFilename(files)
        os.rename(folder, join(cwd, new_folder_name))
  
    return 0


def listFolders(cwd):
  
    folders = [x[0] for x in os.walk(cwd)]
    folders.remove(cwd)

    return folders


def filesAreGood(files):

    if len(files) != 1:
        print('WARNING: {} contains not exaclty 1 file!'.format(folder))
        return False

    if not isfile(files[0]):
        print('WARNING: {} contains a subfolder!'.format(folder))
        return False

    return True


if __name__ == '__main__':
    main()

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

Gruß Technipion
 

Biber3

Erfahrenes Mitglied
#11
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:
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:
ren "\Users\Biber\Neuer Ordner1\" "beispiel 1"
ren "\Users\Biber\Neuer Ordner2\" "beispiel 2"
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
 
#12
So, zunächst mal sorry für mein langes schweigen. Da ich meinen Vater pflege, ist Zeit ein kostbares Gut ;-)
Danke für Eure Antworten, ich bin mir aber nicht sicher, ob ich Phyton lernen kann (wie gesagt Zeit ...)

Danke Technipion für den Code, ich werde ihn evtl ausprobieren, besser wäre es, wenn ich verstehen würde, welche Befehle ich meinem Rechner gebe und ich bin eben gerade dabei Batch-Programmierung zu lernen.
Sollte mein (jetzt schon) qualmender Kopf nach meinen Crash Kurs in Batch noch in der Lage sein, lernen zu können., mache ich mich sicher auch an Phython.
Vorerst muss batch reichen. Und ich habe sogar hierbei (bisher) nur die Hälfte verstanden (ich bin über 40 da dauert alles etwas länger *gg*)
Danke auch an alle anderen die sich Gedanken gemacht haben.
Ich hätte noch etwa 2 Millionen anderer kleinere Ideen, die ich mit Stapelverarbeitung angehen könnte um kleine Helferlein zu programmieren (zum Beispiel wie ich einen Ordner mit einem in einer Textdatei definiertem Index abgleichen kann), aber zuerst das will ich das "Ordnerproblem" gelöst (und verstanden) haben ;-)
Dauert nur etwas länger ...
 

Neue Beiträge