tkt2208
Goto Top

Via CMD Dateien in Ordner sortieren

Hallo zusammen,

ich habe in einem Ordner sehr viele Dateien mit gleichem Namen die sich nur am Ende durch eine Zahl unterscheiden.
zB.
Bild 1.*
Bild 2.*
Bild 3.*

Bilder 1.*
Bilder 2.*
Bilder 3.*

Ich möchte diese via CMD in einen Ordner verschieben der den Namen der Dateinen trägt aber ohne die Zahl am Ende der Datei. Also soll die CMD einen Ordner erstellen der z.B. "Bild" heißt und alle Dateien die mit Bild beginnen dort hinein verschoben werden. Und das ganze natürlich auch für Bilder.

Ich hoffe Ihr könnt meinen Ausführungen folgen und mir bei der Lösung meiner Aufgabe behilflich sein.

Mit freundlichen Grüßen der tkt

Content-Key: 294089

Url: https://administrator.de/contentid/294089

Printed on: April 26, 2024 at 00:04 o'clock

Member: Friemler
Friemler Jan 24, 2016 at 12:42:37 (UTC)
Goto Top
Hallo tkt,

wie viel Aufwand man in Batchscript treiben muss, um die Dateinamen in ihre Bestandteile zu zerlegen, hängt sehr davon ab, wie die Dateinamen genau aufgebaut sind.

  1. Ist der erste Namensteil immer durch ein Leerzeichen von der Zahl getrennt?
  2. Kann der erste Namensteil auch Leerzeichen und/oder Ziffern enthalten?

Gruß
Friemler
Mitglied: 114757
114757 Jan 24, 2016 updated at 15:23:22 (UTC)
Goto Top
Powershell:
$quelle = 'c:\quelle'  
$ziel = 'c:\ziel'  
gci $quelle -recurse | ?{!$_.PSisContainer} | %{
    $dest = "$ziel\$($_.Basename -replace '(.*?)[\s\d]*$','$1')"  
    if(!(Test-Path $dest)){md $dest}
    move-item $_.Fullname -destination $dest
}

Gruß jodel32
Member: tkt2208
tkt2208 Jan 24, 2016 updated at 14:53:52 (UTC)
Goto Top
Zitat von @114757:

Powershell:
> $quelle = 'c:\quelle'  
> $ziel = 'c:\ziel'  
> gci $quelle -recurse | ?{!$_.PSisContainer} | %{
>     $dest = "$ziel\$($_.Basename -replace '(.*)\s?\d*$','$1')"  
>     if(!(Test-Path $dest)){md $dest}
>     move-item $_.Fullname -destination $dest
> }
> 

Dieses erstellt für jede Datei einen Ordner also Bild 1, Bild 2, Bild 3, Bilder 1, Bilder 2, Bilder 3,

ich benötige aber nur Bild und Bilder


Zitat von @Friemler:
  1. Ist der erste Namensteil immer durch ein Leerzeichen von der Zahl getrennt?
  2. Kann der erste Namensteil auch Leerzeichen und/oder Ziffern enthalten?

der Namensteil kann auch Leerzeichen enthalt die Zahl ist aber immer mit Leerzeichen vom Namensteil getrennt z.B.
Bild 1
Bild Bild 2
Bild Bild Bild 3
Mitglied: 114757
114757 Jan 24, 2016 updated at 14:57:21 (UTC)
Goto Top
Dieses erstellt für jede Datei einen Ordner also Bild 1, Bild 2, Bild 3, Bilder 1, Bilder 2, Bilder 3,

Falsch, mein Skript erstellt nur Ordner mit Namen ohne die Zahlen am Ende ...und schiebt die jeweilig zugehörigen Files dort rein ...
Member: tkt2208
tkt2208 Jan 24, 2016 updated at 15:10:30 (UTC)
Goto Top
Zitat von @114757:
Falsch, mein Skript erstellt nur Ordner mit Namen ohne die Zahlen am Ende ...und schiebt die jeweilig zugehörigen Files dort rein ...

dann muss ja irgendetwas falsch gemachen haben weil er bei mir die Ordner Bild 1, Bild 2, Bild 3, Bilder 1, Bilder 2, Bilder 3 erstellt hat und dann die Dateien hinein verschoben hat.

aber was habe ich falsch gemacht ?
Mitglied: 114757
114757 Jan 24, 2016 updated at 15:11:35 (UTC)
Goto Top
Zitat von @tkt2208:
aber was habe ich falsch gemacht ?
Du hast meinen Code in einer früheren Version kopiert, ich hatte den Regex kurz hinterher nochmal korrigiert.
Member: tkt2208
tkt2208 Jan 24, 2016 at 15:16:37 (UTC)
Goto Top
Zitat von @114757:
Du hast meinen Code in einer früheren Version kopiert, ich hatte den Regex kurz hinterher nochmal korrigiert.

ich habe es jetzt noch einmal kopiert es bleibt aber unverändert.
Mitglied: 114757
114757 Jan 24, 2016 updated at 15:32:24 (UTC)
Goto Top
Zitat von @tkt2208:
ich habe es jetzt noch einmal kopiert es bleibt aber unverändert.
Kann ich nicht bestätigen klappt hier einwandfrei!

Zeile 4 muss exakt so lauten:
 $dest = "$ziel\$($_.Basename -replace '(.*?)[\s\d]*$','$1')" 
Member: tkt2208
tkt2208 Jan 24, 2016 updated at 15:42:59 (UTC)
Goto Top
Zitat von @114757:
>  $dest = "$ziel\$($_.Basename -replace '(.*?)[\s\d]*$','$1')" 

Vielen Dank jetzt funktioniert es.

Nur noch eine Frage ?

Muss ich immer eine Quelle und Ziele angeben oder ist es auch möglich das immer der Quell und Zielpfad das Verzeichnis ist in dem die Powershell Datei liegt und gestartet wird ?
Mitglied: 114757
114757 Jan 24, 2016 updated at 15:59:32 (UTC)
Goto Top
Zitat von @tkt2208:
Muss ich immer eine Quelle und Ziele angeben oder ist es auch möglich das immer der Quell und Zielpfad das Verzeichnis ist in dem die Powershell Datei liegt und gestartet wird ?
Nein natürlich nicht, das war ja nur deinem Verständnis halber so gestaltet.

In dem Fall so, das Skript selber muss dann ja vom Verschieben ausgenommen werden (-Exclude *.ps1) face-wink
$path = $PSScriptRoot
gci $path -recurse -Exclude *.ps1 | ?{!$_.PSisContainer} | %{
    $dest = "$path\$($_.Basename -replace '(.*?)[\s\d]*$','$1')"  
    if(!(Test-Path $dest)){md $dest}
    move-item $_.Fullname -destination $dest
}

Wichtiger Hinweis: Wenn noch Powershell Version 2 benutzt wird, muss Zeile 1 so lauten:
$path = Split-Path $MyInvocation.MyCommand.Definition -Parent