Batch oder PS-Script, um Dateien mit gleichen Buchstaben in Verzeichnis zu verschiebe

rkrause

Mitglied
Ich suche ein Script, mit dem ich schnell ein Verzeichnis mit mehren tausenden Dateien bereinigen kann.

Es gibt hierbei immer ein Bündel von Dateien, die die selben Anfangsbuchstaben haben, und am Ende eine individuelle Erklärung haben. Ich möchte nun dieses Bündel in ein seperates Verzeichnis schieben, so das diese in jeweilige Unterordner liegen.

Ausgangssituation:

Datei_2010_bezeichnung1
Datei_2010_bezeichnung2
Datei_2010_bezeichnung3

Datei_2011_bezeichnung1
Datei_2011_bezeichnung2
Datei_2011_bezeichnung3

-----

Endsituation:
Verzeichnis: Datei_2010
mit Dateien:
Datei_2010_bezeichnung1
Datei_2010_bezeichnung2
Datei_2010_bezeichnung3

Verzeichnis: Datei_2011
mit Dateien:
Datei_2011_bezeichnung1
Datei_2011_bezeichnung2
Datei_2011_bezeichnung3

------

Ich habe zwar schon einige Batch/PS-Scripte aus Codeschnipseln zusammengeschustert, habe hier aber überhaupt keine Idee, wie ich dies realisieren kann.

Stand von euch schon jmd vor diesen Problem und hat eventuell Codeschnipsel?

Gruß
 

deepthroat

Erfahrenes Mitglied
Hi.

Nach welchem Schema sind die Dateien denn benannt? Haben die Namen eine konstante Präfix-Länge (immer 11 Zeichen so wie in deinem Beispiel)?
 

rkrause

Mitglied
Die Länge ist hierbei, soweit ich es gesehen habe, leider variabel. Es spricht hier aber auch nichts dagegen, einfach die ersten 15 - 20 Zeichen zu nehmen und daraus ein Verzeichnis zu erstellen und die passenden Dateien zu verschieben, ggf mit mehreren Durchläufen. Eventuell könnte man hier auch Trennzeichen wie "_" oder "-" verwenden.

Ich vermute mal, ich muss einige Verzeichnisse sowieso noch nachträglich umbenennen. Wenn diese aber schon grob anlegt sind, ist das trotzdem eine enorme Zeitersparnis.
 

deepthroat

Erfahrenes Mitglied
Das ist ja alles etwas vage...

Bsp:
Code:
@echo off
setlocal enabledelayedexpansion

for %%f in (*) do (
  set dir=%%f
  set dir=!dir:~0,15!
  verify >nul
  if not exist "!dir!" mkdir "!dir!"
  if not errorlevel 1 (
    if not "%%f"=="!dir!" (
      move /-Y "%%f" "!dir!"
    ) else (
      echo."Fehler - nicht verarbeitet: %%f" >&2
    )
  )
)
endlocal
Das Skript verarbeitet alle Dateien im aktuellen Verzeichnis und verwendet eine Präfixlänge von 15 Zeichen.
 
Zuletzt bearbeitet:

ComFreek

Mod | @comfreek
Moderator
Einfach so aus dem Kopf geschrieben: Naja, jetzt nicht mehr ganz:
Javascript:
Get-ChildItem . | Where{!$_.PsIsContainer} | % {
  $str = [System.IO.Path]::GetFileName($_.FullName);

  $firstIdx = $str.IndexOf("_");
  $secondIdx = $firstIdx + $str.Substring($firstIdx + 1).IndexOf("_") + 1;
  $newFolderName = $str.Substring(0, $secondIdx);

  md -name $str;
  Move-Item $_.FullName ($_.DirectoryName + "\" + $newFolderName + "\" + $str);
}
Bitte unbedingt vorher Backup ausführen!