Ordner nach Inhalt umbenennen

German support forum

Moderators: Hacker, Stefan2, white

User avatar
Kerstin83
Senior Member
Senior Member
Posts: 341
Joined: 2007-11-25, 10:18 UTC
Location: Hannover

Ordner nach Inhalt umbenennen

Post by *Kerstin83 »

Liebes Forum, :D :D

ich habe Fotodateien, die mit einer 4stelligen Nummer anfangen. Sie befinden sich in Ordnern. Nun möchte ich gerne, um eine Chronologie reinzubekommen, den Ordnernamen jeweils die niedrigste 4stellige Nummer voranstellen.

Beispiel

Der Ordner "Hochzeit" enthält die Bilder 0225.jpg, 0226.jpg ...
Der Ordner "Spaziergang" die Bilder 3217.jpg, 3218.jpg...
Die Ordner sollen umbenannt werden in
"0225 Hochzeit" und
"3217 Spaziergang"

Ist das mit TC möglich

Und noch besser wäre es, wenn es nicht unbedingt die ersten 4 Ziffern, sondern z.B. ab Stelle 3 bis Stelle 7 sein kann.

LG
Ich hasse Leute, die Sätze nicht zuende
User avatar
Kerstin83
Senior Member
Senior Member
Posts: 341
Joined: 2007-11-25, 10:18 UTC
Location: Hannover

Post by *Kerstin83 »

Hat niemand eine Idee? :shock: :shock:

Oder bin ich endlich mal an die Grenzen vom TC gestoseen? :D

LG
Ich hasse Leute, die Sätze nicht zuende
User avatar
Dalai
Power Member
Power Member
Posts: 9990
Joined: 2005-01-28, 22:17 UTC
Location: Meiningen (Südthüringen)

Post by *Dalai »

Ohne zusätzliches Skripting wird das nicht gehen, denn irgendwie muss ja festgestellt werden, welche Zahl nun am kleinsten ist.

Ich versuche mich mal an Batch und/oder AutoIt und melde mich wieder.

MfG Dalai
#101164 Personal licence
Ryzen 5 2600, 16 GiB RAM, ASUS Prime X370-A, Win7 x64

Plugins: Services2, Startups, CertificateInfo, SignatureInfo, LineBreakInfo - Download-Mirror
User avatar
Dalai
Power Member
Power Member
Posts: 9990
Joined: 2005-01-28, 22:17 UTC
Location: Meiningen (Südthüringen)

Post by *Dalai »

So, ein erster Entwurf für AutoIt, der mit Sicherheit noch das eine oder andere Problem hat:

Code: Select all

;
; AutoIt Version: 3.10+
; Language:       Deutsch
; Platform:       Win98/2000/XP/2003
; Author:         Dalai
;
; Last Update: 20.05.2011
;
; Script Function:
;      "Ordner nach Inhalt umbenennen" -- http://ghisler.ch/board/viewtopic.php?t=29432
;
;      Skript erwartet eine Listendatei als Parameter, wobei jede Zeile ein
;      Verzeichnis repräsentiert, das mit absolutem Pfad angegeben ist!
; ----------------------------------------------------------------------------
; Set up our defaults
; ----------------------------------------------------------------------------

#include <File.au3>

;======================= Benutzerdefinierte Variablen =======================
global const $DEBUG=1
global const $FILEMASK = "*"
global const $STARTVAL = 1
global const $ENDVAL = 4
;============================================================================

global $hnd, $line, $filelist
global $oldname, $newname
global $num, $num_temp, $str_num
global $msg, $title


if $CmdLine[0] > 0 then
    ;-- Datei öffnen
    $hnd = FileOpen($CmdLine[1], 0)
    if @error <> -1 then
        while 1
            $num = -1
            ;-- Zeilenweise lesen, wobei jede Zeile ein Verzeichnis repräsentiert
            $line = FileReadLine($hnd)
            if @error <> 0 then ExitLoop
;            MsgBox(0, "", "#" & $line & "#")
            ;-- Dateiliste zu diesem Verzeichnis erhalten
            $filelist = _FileListToArray($line, $FILEMASK, 1)
            if (@error == 0) AND IsArray($filelist) then
                ;-- Dateiliste nach (der Datei mit der) kleinsten Zahl durchsuchen
                for $i=1 to $filelist[0]
;                    MsgBox(0, "", $filelist[$i])
                    $str_num = StringMid($filelist[$i], $STARTVAL, $ENDVAL)
                    $num_temp = Int($str_num)
                    if @error <> 1 then
                        ;-- Wenn der neue Zahlenwert kleiner ist als der alte, werden die Variablen gesetzt
                        if ($num == -1) OR ($num_temp < $num) then
                            $num = $num_temp
                            $oldname = $line
                            $efn = ExtractFileName(TRIM_TRAILING_BACKSLASH($line))
;                            MsgBox(0, "", StringReplace($line, $efn, StringFormat("%i %s", $num, $efn)))
                            $newname = StringReplace($line, $efn, StringFormat("%i %s", $num, $efn))
                        EndIf    
                    EndIf
                Next
                ;$msg &= $filelist[$i] & " ==> " $num & " " $filelist[$i] & @CRLF
                ;-- Variablenausgabe schicker machen
                $msg &= StringFormat("%s ==> %s", $oldname, $newname) & @CRLF
                if not $DEBUG then
                    ;-- Verzeichnis umbenennen
                    DirMove($oldname, $newname)
                EndIf
            EndIf
        WEnd
        FileClose($hnd)
    EndIf
EndIf

if $DEBUG then $title = "Debug"
MsgBox(0, $title, $msg)


;==============================================================================
;----------------- trim trailing backslash from a string/path----------

Func TRIM_TRAILING_BACKSLASH($str)
    local $_string = $str

    if (StringRight($_string, 1) == "\") then
        $_string = StringTrimRight($_string, 1)
    EndIf

    Return $_string
EndFunc


;---------------- Dateiname aus einem String extrahieren --------------------------------
Func ExtractFileName($full_filename)

  if $full_filename == "" then
    SetError(1)
    Return $full_filename
  EndIf

  local $new_filename = StringSplit($full_filename, "\")
  if @error==1 then
    Return $full_filename
  EndIf

  Return $new_filename[$new_filename[0]]
EndFunc
WICHTIG:
  • Erstmal - wie üblich - mit Testdaten oder Kopien probieren. Wenn du mit der Ausgabe zufrieden bist, kannst du die Variable $DEBUG auskommentieren oder auf 0 setzen, damit das Skript arbeitet.
  • Die Variablen $FILEMASK, $STARTVAL und $ENDVAL kannst und sollst du selbst anpassen. $FILEMASK ist die Dateimaske der Dateitypen, die interessant sind, also beispielsweise nur Bilder oder nur EXE-Dateien oder sonstwas. $STARTVAL ist dein erwünschter Startwert, die Stelle x, ab der beachtet werden soll. $ENDVAL erklärt sich damit von selbst.
  • Das Skript prüft nicht, ob Verzeichnisse existieren; ist das der Fall, verschiebt DirMove nicht, sondern tut nichts.
  • Die Ausgabe und der Inhalt der Messagebox ist unabhängig vom Erfolg des Verschiebens.
  • Mache deine Listendatei nicht zu groß, denn die Messagebox wird sonst zu lang und geht u.U. über den Bildschirmrand hinaus
  • Starten kannst du das Skript z.B. über einen Button mit dem Parameter "%L" inkl. Anführungszeichen.
  • Das Skript kann keine führenden Nullen, die musst du im Zweifel mit dem MUT des TC ergänzen.
  • Die Listendatei sollte möglichst nicht in UTF8 oder gar Unicode codiert sein, damit AutoIt keinen Mist baut. Es ist aber gut möglich, dass neuere AutoIt-Versionen damit kein Problem mehr haben. Da ich aber nur mit einer alten Version getestet habe, kann ich das nicht beurteilen.
MfG Dalai
Last edited by Dalai on 2011-05-20, 16:08 UTC, edited 1 time in total.
#101164 Personal licence
Ryzen 5 2600, 16 GiB RAM, ASUS Prime X370-A, Win7 x64

Plugins: Services2, Startups, CertificateInfo, SignatureInfo, LineBreakInfo - Download-Mirror
User avatar
Kerstin83
Senior Member
Senior Member
Posts: 341
Joined: 2007-11-25, 10:18 UTC
Location: Hannover

Post by *Kerstin83 »

Vielen Dank!!

Das sieht ja mächtig kompliziert aus...aber ich will es mal versuchen.

Was genau mache ich denn mit dem Skript. Wie speichere ich es...

Benötige ich Zusatzsoftware (AutoIT) oder läuft das so?

LG

Kerstin
Ich hasse Leute, die Sätze nicht zuende
User avatar
Dalai
Power Member
Power Member
Posts: 9990
Joined: 2005-01-28, 22:17 UTC
Location: Meiningen (Südthüringen)

Post by *Dalai »

Kerstin83 wrote:Das sieht ja mächtig kompliziert aus...
Ist es auch :lol: - jedenfalls für jemanden, der AutoIt nicht kennt.
Was genau mache ich denn mit dem Skript. Wie speichere ich es...
Einfach den ganzen CODE-Block kopieren und in eine neue Textdatei einfügen, die als *.au3 abgespeichert wird.
Benötige ich Zusatzsoftware (AutoIT)
Ohne geht's nicht. Lad dir AutoIt als Self Extracting Archive von oben verlinkter Seite und pack es (mit dem TC) in ein Verzeichnis deiner Wahl aus (die Installationsversion kann man auch nehmen, ist aber für diesen Fall wohl etwas Overkill).

Dann erstellst du dir einen Button, der dieses "Ausführungsformat" hat:

Code: Select all

AutoIt3.exe skript.au3 "%L"
wobei skript.au3 und "%L" im Feld "Parameter" einzutragen sind.

Zum Benutzen des Buttons markierst du die gewünschten Verzeichnisse und klickst auf den Button.

MfG Dalai
#101164 Personal licence
Ryzen 5 2600, 16 GiB RAM, ASUS Prime X370-A, Win7 x64

Plugins: Services2, Startups, CertificateInfo, SignatureInfo, LineBreakInfo - Download-Mirror
User avatar
Kerstin83
Senior Member
Senior Member
Posts: 341
Joined: 2007-11-25, 10:18 UTC
Location: Hannover

Post by *Kerstin83 »

Hallo, was hat es denn mit der Listendatei auf sich?

wie muss sie heißen, wo muss sie stehen, und wozu dient sie/was muss in ihr stehen?

LG

Kerstin
Ich hasse Leute, die Sätze nicht zuende
User avatar
Dalai
Power Member
Power Member
Posts: 9990
Joined: 2005-01-28, 22:17 UTC
Location: Meiningen (Südthüringen)

Post by *Dalai »

Kerstin83 wrote:was hat es denn mit der Listendatei auf sich?
OK, war vielleicht ungünstig formuliert, auch wenn der Parameter %L eines Buttons klar sein sollte (weil in der TC-Hilfe erklärt):

Code: Select all

%L, %l, %F, %f, %D, %d, %WL, %WF, %UL, %UF erzeugt im TEMP-Verzeichnis einen Listendatei mit den Namen der markierten Dateien und Verzeichnisse, und fügt den Namen der Listendatei in die Kommandozeile ein. Die Liste wird nach Beendigung des Programms von Total Commander gelöscht. Es können 10 verschiedene Arten von Listen erzeugt werden:
%L Lange Dateinamen inkl. komplettem Pfad, z.B. c:\Eigene Dateien\langer Name.txt
Das heißt also kurz und knapp: Du brauchst dich darum (direkt) gar nicht zu kümmern, das macht TC. Der Hinweis auf die Größe dieser Datei ist also nur indirekt durch die Anzahl der markierten Verzeichnisse zu beeinflussen - und genau davon solltest du nicht zuviele auf einmal markieren.

MfG Dalai
#101164 Personal licence
Ryzen 5 2600, 16 GiB RAM, ASUS Prime X370-A, Win7 x64

Plugins: Services2, Startups, CertificateInfo, SignatureInfo, LineBreakInfo - Download-Mirror
User avatar
Hacker
Moderator
Moderator
Posts: 13142
Joined: 2003-02-06, 14:56 UTC
Location: Bratislava, Slovakia

Post by *Hacker »

Kerstin83,
Meine kleine Lösung:

Code: Select all

Start = %3%
End = %4%
Length := End-Start+1
OriginalWorkingDir = %A_WorkingDir%

Loop, Read, %1%
{
	SetWorkingDir, %A_LoopReadLine%
	FileList =
	Loop, %2%
		FileList = %FileList%%A_LoopFileName%`n
	Sort, FileList, CL, P%Start%
	StringMid, NewNamePart, FileList, %Start%, %Length%
	SetWorkingDir, %OriginalWorkingDir%
	OldDirName =
	NewDirName =
	OldDirName := RegExReplace(A_LoopReadLine, ".*\\(.*)\\", "$1")
	NewDirName = %NewNamePart% %OldDirName%
	IfEqual, 5, MOVE
		FileMoveDir, %OldDirName%, %NewDirName%, R
	Else
		MsgBox, "%OldDirName%" -> "%NewDirName%"
}
Man braucht dazu AutoHotkey, benutzt man genau wie AutoIt.

Parameter:

Code: Select all

skript.ahk "%L" *.* 3 7
wobei skript.ahk der Name der Datei in der du das Skript speicherst ist,
"%L" muss da sein, ist die Liste der markierten Verzeichnisse im TC die der TC automatisch an Stelle des %L einfügt
*.* ist der Dateifilter, *.* durchsucht alle Dateien in den Verzeichnissen um die alphabetisch erste zu finden, *.jpg z.B. nur die JPG Dateien
3 und 7 sind, wie du geschrieben hast, "Stelle 3 bis Stelle 7"
MOVE muss als letzter Parameter angehängt werden, wenn du umbenennen willst, sonst arbeitet das Skript nur im Testmodus.

HTH
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.
User avatar
Kerstin83
Senior Member
Senior Member
Posts: 341
Joined: 2007-11-25, 10:18 UTC
Location: Hannover

Post by *Kerstin83 »

wo genau muss man das MOVE anhängen :?
Muss man AutoHotkey herunterladen und installieren?

Ich werde dann mal beide Möglichkeiten testen.

LG

Kerstin
Ich hasse Leute, die Sätze nicht zuende
User avatar
Hacker
Moderator
Moderator
Posts: 13142
Joined: 2003-02-06, 14:56 UTC
Location: Bratislava, Slovakia

Post by *Hacker »

Kerstin83,
wo genau muss man das MOVE anhängen

Code: Select all

skript.ahk "%L" *.* 3 7 MOVE
Aber versuche es zuerst ohne das MOVE.
Muss man AutoHotkey herunterladen und installieren?
Ist wahrscheinlich am einfachsten.
http://www.autohotkey.com/download/
AutoHotkey_L oder Basic, ist egal.

EDIT: Oder hier das Skript direkt runterladen, ohne AutoHotkey installieren zu müssen:
http://fyels.com/iir00p

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.
User avatar
Kerstin83
Senior Member
Senior Member
Posts: 341
Joined: 2007-11-25, 10:18 UTC
Location: Hannover

Post by *Kerstin83 »

Lieber Roman, lieber Dalai,

ich habe beides getestet und bin leider mit beiden gescheitert.

Bei der AutoIt-Version kommt am Ende eine Messagebox mit "ok" (Debug rausgenommen).

Bei der AHK-Version kommt am Ende gar nichts. Auch nicht, wenn ich MOVE ergänze.

Ich weiß überhaupt nicht, was ich falsch mache.

Ich habe die Ordner markiert, in denen sich die Dateien befinden und die Skripts gestartet. Parameter sind eigentlich so eingegeben wie ihr gesagt habt. :? :? :?

LG Kerstin
Ich hasse Leute, die Sätze nicht zuende
User avatar
Hacker
Moderator
Moderator
Posts: 13142
Joined: 2003-02-06, 14:56 UTC
Location: Bratislava, Slovakia

Post by *Hacker »

Hello Kerstin,
Angenommen das Skript RenameDirByContents.exe is unter "C:\Programme\AHK Skripte\RenameDirByContents.exe" untergebracht. Dann muss ein Button in der Button Bar so aussehen:

Kommando:

Code: Select all

"C:\Programme\AHK Skripte\RenameDirByContents.exe"
Parameter:

Code: Select all

"%L" *.* 3 7
Startpfad:
<leer>


Wahrscheinlich ist irgendetwas im Startpfad eingetragen und das nimmt das Skript als den Ausgangspunkt, an Stelle von dem Verzeichnis wo du dich gerade befindest und woraus du das Skript aufrufst. (Ich denke dasselbe gilt für Dalais Skript.) Der Rest der Felder ist nicht so wichtig.
Dann markierst du die Verzeichnisse Hochzeit und Spaziergang und klickst auf den Button mit dem Skript.

HTH
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.
User avatar
Kerstin83
Senior Member
Senior Member
Posts: 341
Joined: 2007-11-25, 10:18 UTC
Location: Hannover

Post by *Kerstin83 »

Vielen Dank, Roman!!!!!!!!!!!!!!!!! :D :D

Daran lag es. Jetzt funktioniert es super. Ich werde aber erstmal die 26 GB Fotos kopieren und das Skript erst dann darauf loslassen...

Kann man hier eigentlich Sternchen verteilen oder so etwas, wenn jemand so geholfen hat?

Würde aber auch gerne Dalais Skript zum Laufen kriegen, das liegt noch an etwas anderem.

Liebe Grüße und noch einmal ganz großen Dank

Kerstin
Ich hasse Leute, die Sätze nicht zuende
User avatar
Dalai
Power Member
Power Member
Posts: 9990
Joined: 2005-01-28, 22:17 UTC
Location: Meiningen (Südthüringen)

Post by *Dalai »

Kerstin83 wrote:Bei der AutoIt-Version kommt am Ende eine Messagebox mit "ok" (Debug rausgenommen).
Wieso nimmst du das Debug (jetzt schon) raus? Ich schrieb doch: erst testen und Ausgabe prüfen und dann erst Debug rausnehmen/auf Null setzen.

Wie sieht dein Button für das AutoIt-Skript aus? Das prinzipielle Vorgehen ist für beide Skripte das gleiche, nur sind die Parameter unterschiedlich (was ich durchaus noch angleichen könnte, momentan fehlt mir aber Zeit und Lust).

MfG Dalai
#101164 Personal licence
Ryzen 5 2600, 16 GiB RAM, ASUS Prime X370-A, Win7 x64

Plugins: Services2, Startups, CertificateInfo, SignatureInfo, LineBreakInfo - Download-Mirror
Post Reply