hpoperator
Goto Top

Dateien in Ordner verschieben (fast gleiche Benennung) - ersuche euren Rat!

Hallo liebe Community,

ich stehe gerade vor folgender Aufgabenstellung und weiß leider eine Lösung:

Ich habe in einem Ordner sowohl duzende von Dateien, als auch Ordner und ich müsste jede dieser Dateien in den vorgesehenen Ordner verschieben.

Die Ordner haben eine 9stellige Nummer, die Dateien ebenfalls, jedoch endet der Dateiname nicht mit dieser 9stelligen Nummer, sondern es folgen noch einige Zahlen.
Beispiel:

Ordner 123456789
Ordner 885522990
Datei 12345678912
Datei 123456789_cbf
Datei 123456789_07_142
Datei 123456789-place-of_012
Datei 8855229904587
Datei 885522990_4589
Datei 885522990_05_458
usw.

Die Dateien sind unterschiedlich, es handelt sich dabei um .png , .jpg , .tif , .pdf , .psd , ja sogar .docx und .xls sind dabei.

Nun habe ich das bisher sehr aufwendig gelöst, in dem ich ganz konventionell/händisch in diesem Ordner, in dem sich sowohl die Ordner als auch die Dateien befinden, eine Suche gestartet habe beispielswiese "123456789" und hier bekam ich sowohl den Ordner, als auch die Dateien angezeigt und markierte dann die angezeigten Dateien und verschob Sie in den Ordner......

Leider sind es hunderte solcher ordner und tausende von Dateien face-sad

könnte mir vielleicht jemand einen Ratschlag geben, wie ich dies mit weniger Aufwand bewerkstelligen könnte?
Vielleicht mit einer Batch.... oder vielleicht gibt es einen Kniff in Windows11 den ich noch nicht kenne?

Ich wäre euch wirklich sehr dankbar.

LG

Content-ID: 3785055628

Url: https://administrator.de/forum/dateien-in-ordner-verschieben-fast-gleiche-benennung-ersuche-euren-rat-3785055628.html

Ausgedruckt am: 20.04.2025 um 19:04 Uhr

SeaStorm
Lösung SeaStorm 29.08.2022 aktualisiert um 22:26:39 Uhr
Goto Top
hi
mit Powershell eine Kleinigkeit.
Schmier das da in die ISE (Unter Start ISE eingeben):
$source = "C:\temp\test"  

gci $source -Directory | % {
#Write-Host "Folder: $($_.Name)" 
gci $source -File -Filter "$($_.name)*" | Move-Item -Destination $_.FullName  
}
Vorrausgesetzt das die Dateinamen immer entsprechend dem Ordnernamen beginnen und es da keine überschneidungen gibt mit kürzeren Ordnernamen, also 12345 und 1234.
Dann müsste man das ganze ein bisschen genauer machen
Crusher79
Crusher79 29.08.2022 um 22:34:41 Uhr
Goto Top
Ggf. noch $source mit $base ersetzen? Oder andersrum. Damit der angegebene Folder auch Verwendung findet?
3714160434
Lösung 3714160434 29.08.2022, aktualisiert am 30.08.2022 um 00:06:45 Uhr
Goto Top
$root =  'd:\data'   
Get-Childitem $root -File |  ?{$_.Basename -match '.{9}'} | group {$matches} | %{$_.Group | Move-Item -Destination (md "$root\$($_.Name)" -Force).Fullname}  
SeaStorm
SeaStorm 29.08.2022 um 22:37:08 Uhr
Goto Top
Zitat von @Crusher79:

Ggf. noch $source mit $base ersetzen? Oder andersrum. Damit der angegebene Folder auch Verwendung findet?

Ups ja danke.
hpoperator
hpoperator 29.08.2022 um 22:48:42 Uhr
Goto Top
danke euch vielmals für die zeitnahe Antworten!

bin nun etwas verwirrt face-smile

kenne mich mit Powershell nicht aus und weiß auch nicht wie ich das nutzen kann.
Könnte mir das final noch jemand erklären?

Also ich nutze nun folgenden Code:
$base= "C:\temp\test"  

gci $base -Directory | % {
#Write-Host "Folder: $($_.Name)" 
gci $source -File -Filter "$($_.name)*" | Move-Item -Destination $_.FullName  
}

stimmt das so?


Zitat von @SeaStorm:
Vorrausgesetzt das die Dateinamen immer entsprechend dem Ordnernamen beginnen und es da keine überschneidungen gibt mit kürzeren Ordnernamen, also 12345 und 1234.
Dann müsste man das ganze ein bisschen genauer machen

überschneidungen mit den Ordnernamen gibt es nicht:
für gewöhnlich ist der Ordner mit 9zahlen bennant, aber auch "203729018ONL" und "9000100510" ist dabei......
hier sind allerding die Dateien ebenso benannt, nur, wie erwähnt, wird es dann alphanumerisch weiterfortgeführt.

Zum besseren Verständnis.....
Bei den Dateien handelt es sich um Artikelfotos, Gutachten von Artikeln, Produktvideos, etc.
und diese kommen alle in den Ordner mit der Artikelnummer
Crusher79
Crusher79 29.08.2022 aktualisiert um 23:08:19 Uhr
Goto Top
Hallo, die erste Lösung nutzt als "Leitdaten" die Ordner. Die andere "von - bis" und schneidet den Rest des Dateinamens ab.

Es geht kurz darum die Ordner und Dateien zu vergleichen. Am einfachsten ist es die Ordnernamen zu nehmen. $_.name an der Stelle lässt c:\...\ weg und du hast nu den Ordner. Wie man es auch "lesen" würde. Dann wird geschaut welche Dateien mit diesen Worten anfangen. Durch den * werden - wie in vielen Bereichen gewohnt - nichts weiter, 1 Buchstabe/ Zahl oder mehrere gefunden.

Also genau was du willst. Der Anfang ist gleich den Ordnernamen, der Rest egal. Genau immer diese eine Treffer wird dann in den Ordner kopiert. Fertig.

Die 2. Variante ist etwas komplizierter. Weil wir aber was eindeutiges zum Vergleichen haben würde ich auch die erste Lösung vorziehen. Im Prinzip wäre die Übersetzung exakt das, was du verlangst!

$base= "C:\temp\test" <<< Ordner mit Unterordnern und Dateien!  

gci $base -Directory | % { <<< Für jeden ORDNER wird etwas gemacht
#Write-Host "Folder: $($_.Name)" <<< Hilfestellung - würde ohne den hash # einfach den Ordnernamen zeigen 
gci $source -File -Filter "$($_.name)*" | Move-Item -Destination $_.FullName <<< Holt sich alle DATEIEN und zeigt nur die an/ macht nur was mit denen, deren Name mit den Ordner Namen beginnt  

Genau der Treffer wird dann mit Move-Item in den den Ordner kopiert

}
SeaStorm
SeaStorm 29.08.2022 aktualisiert um 23:31:07 Uhr
Goto Top
Zitat von @hpoperator:

Also ich nutze nun folgenden Code:
Nein DEN bitte nicht face-smile hatte da die Variable Source nicht sauber umgeschrieben. Hiess erst mal base, mochte ich aber nicht face-smile Nimm den jetzt dort stehenden

kenne mich mit Powershell nicht aus und weiß auch nicht wie ich das nutzen kann.
Könnte mir das final noch jemand erklären?
Starte einfach ISE und kopiere den Code da in den Editor-Bereich und passe den Pfad an.
Jetzt kannst du alles mit F5 ausführen oder mit F8 einzelne Markierte Befehle bzw Bereiche. Also Markiere mal GCI und drücke F8. Dann führt er GCI aus.
GCI ist das Kürzel für Get-ChildItem und das Listet halt Dateien und Ordner auf


Variable SOURCE definieren mit dem Pfad in dem der ganze Spass liegt
$source = "C:\temp\test"
Alle Ordner in dem Pfad auflisten und in einer Schleife einzeln durchlaufen
gci $source -Directory | % {
Bei Bedarf das # entfernen, dann gibt er den Aktuellen Ordnernamen aus. mit dem # Davor wird die Zeile ignoriert
#Write-Host "Folder: $($_.Name)"
Jedes mal wenn ein Schleifendurchlauf erfolgt werden Alle Dateien aufgelistet die wie der Ordnername beginnt. Jede dieser Dateien wird dann in den entsprechenden Ordner verschoben
gci $source -File -Filter "$($_.name)*" | Move-Item -Destination $_.FullName
}
hpoperator
hpoperator 29.08.2022 aktualisiert um 23:45:21 Uhr
Goto Top
Zitat von @SeaStorm:

Zitat von @hpoperator:

Also ich nutze nun folgenden Code:
Nein DEN bitte nicht face-smile hatte da die Variable Source nicht sauber umgeschrieben. Hiess erst mal base, mochte ich aber nicht face-smile Nimm den jetzt dort stehenden

kenne mich mit Powershell nicht aus und weiß auch nicht wie ich das nutzen kann.
Könnte mir das final noch jemand erklären?
Starte einfach ISE und kopiere den Code da in den Editor-Bereich und passe den Pfad an.
Jetzt kannst du alles mit F5 ausführen oder mit F8 einzelne Markierte Befehle bzw Bereiche. Also Markiere mal GCI und drücke F8. Dann führt er GCI aus.
GCI ist das Kürzel für Get-ChildItem und das Listet halt Dateien und Ordner auf


Variable SOURCE definieren mit dem Pfad in dem der ganze Spass liegt
$source = "C:\temp\test"
Alle Ordner in dem Pfad auflisten und in einer Schleife einzeln durchlaufen
gci $source -Directory | % {
Bei Bedarf das # entfernen, dann gibt er den Aktuellen Ordnernamen aus. mit dem # Davor wird die Zeile ignoriert
#Write-Host "Folder: $($_.Name)"
Jedes mal wenn ein Schleifendurchlauf erfolgt werden Alle Dateien aufgelistet die wie der Ordnername beginnt. Jede dieser Dateien wird dann in den entsprechenden Ordner verschoben
gci $source -File -Filter "$($_.name)*" | Move-Item -Destination $_.FullName
}

C:\Users\andre\Desktop\Spielwaren-Shop\Artikeldaten\Simba : Die Benennung "C:\Users\andre\Desktop\Spielwaren-Shop\Artikeldaten\Simba" wurde nicht als Name eines Cmdlet,
einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern
enthalten), und wiederholen Sie den Vorgang.
In Zeile:1 Zeichen:8

back-to-top$base= C:\Users\andre\Desktop\Spielwaren-Shop\Artikeldaten\Simba Dick ...

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : ObjectNotFound: (C:\Users\andre\...ikeldaten\Simba:String) , CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

was mache ich denn falsch ?

Lustig ist, dass F8 irgendwie ohne funktion ist
SeaStorm
SeaStorm 29.08.2022 aktualisiert um 23:44:15 Uhr
Goto Top
du hast die Anführungsstriche entfernt.
Die Variable ist ein String, also TEXT. Und das Schreibt man Zwischen " ".
hpoperator
hpoperator 29.08.2022 um 23:45:56 Uhr
Goto Top
Zitat von @SeaStorm:

du hast die Anführungsstriche entfernt.
Die Variable ist ein String, also TEXT. Und das Schreibt man Zwischen " ".

habe sie hinzugefügt und nichts passiert
SeaStorm
SeaStorm 29.08.2022 um 23:46:38 Uhr
Goto Top
schau mal in den ordner ...
hpoperator
hpoperator 29.08.2022 um 23:47:53 Uhr
Goto Top
Zitat von @SeaStorm:

schau mal in den ordner ...

alles noch da, allso sämtliche dateien noch außerhalb der ordner
SeaStorm
SeaStorm 29.08.2022 um 23:48:47 Uhr
Goto Top
dann poste mal mehr Details.
Den vollständigen Code und einen Screenshot von dem Ordner
hpoperator
hpoperator 29.08.2022 aktualisiert um 23:53:45 Uhr
Goto Top
Zitat von @SeaStorm:

dann poste mal mehr Details.
Den vollständigen Code und einen Screenshot von dem Ordner

vollständiger code:

$base= "C:\Users\andre\Desktop\Spielwaren-Shop\Artikeldaten\Simba Dickie BIG\Neuer Ordner"  

gci $base -Directory | % {
#Write-Host "Folder: $($_.Name)" 
gci $source -File -Filter "$($_.name)*" | Move-Item -Destination $_.FullName  

}

beigefügt die screenshots....
geht natürlich noch mit den Dateien weiter.....

ISE kann ich keinen screenshot machen
2022-08-29 23_49_55-nvidia geforce overlay
2022-08-29 23_50_24-dateien in ordner verschieben (fast gleiche benennung) ersuche euren rat - admin
2022-08-29 23_50_37-nvidia geforce overlay
2022-08-29 23_50_54-nvidia geforce overlay
SeaStorm
SeaStorm 29.08.2022 um 23:54:56 Uhr
Goto Top
Ich sagte doch, nimm den NEUEN Code face-smile

Du musst $base mit $source austauschen


$source = "C:\Users\andre\Desktop\Spielwaren-Shop\Artikeldaten\Simba Dickie BIG\Neuer Ordner"  

gci $source -Directory | % {
#Write-Host "Folder: $($_.Name)" 
gci $source -File -Filter "$($_.name)*" | Move-Item -Destination $_.FullName  

}
hpoperator
hpoperator 29.08.2022 um 23:58:08 Uhr
Goto Top
Zitat von @SeaStorm:

Ich sagte doch, nimm den NEUEN Code face-smile

Du musst $base mit $source austauschen


$source = "C:\Users\andre\Desktop\Spielwaren-Shop\Artikeldaten\Simba Dickie BIG\Neuer Ordner"  

gci $source -Directory | % {
#Write-Host "Folder: $($_.Name)" 
gci $source -File -Filter "$($_.name)*" | Move-Item -Destination $_.FullName  

}

ups.... jetzt geht es auch.

DANKE VIELMALS!!!!!!!!!!!!!!!
SeaStorm
SeaStorm 30.08.2022 um 00:04:00 Uhr
Goto Top
Schön face-smile

Gute Nacht