Bitte um Hilfe bei der Sortierung großer Datenmengen - vermutlich am besten via Batch oder Shell
Hallo zusammen!
Ich habe ungeplanter Weise die Betreuung eines "Servers" mit Win 7 64it übernehmen dürfen, wo tausende Dateien in Ordnern liegen, die nicht sortiert sind. Es geht um mehrere TB, die auch noch in verschiedenen Partitionen verstreut liegen. Mein Vorgänger hatte da wohl ein System, aber ich kann leider keines erkennen. Und da er aufgrund von Krankheit ausgefallen und nicht ansprechbar ist, darf ich nun schauen, wie ich damit klar komme...
Es handelt sich immer um 2 Dateien, die zusammen gehören. Einmal die Datei selbst, meist eine .mpg und eine .txt, mit der Beschreibung, was die .mpg beinhaltet. Das Ziel ist es, dass alle Versuche, die zusammengehören in einem Ordner sind und man nicht erst 5 verschiedene Freigaben durchsuchen muss, um alle zusammengehörenden Files zu finden.
Mein Wunsch wäre es, eine Batch/Shell zu haben, die hingeht und die Daten, die zusammengehören in einen Ordner packt und damit das Chaos hier etwas reduziert. Das Problem ist, dass die Benennung der Daten totaler Murks ist. Die Dateinamen haben, soweit ich das mittlerweile überblicken kann ein ähnliches Schema wie folgt:
Versuch234 Station1 2001 12-15 15-05-01
Es wird fast ausschließlich mit Leerzeichen gearbeitet. Es werden zur Trennung der einzelnen Segmente keine Bindestriche, Unterstiche oder ähnliches verwendet.
"Versuch234" kann nur 1 Wort, aber auch ein Satz samt Gedankenstrich sein. Extrem-Beispiel: "Wir testen das neue Labor - hoffentlich geht alles"
"Station1" ist entweder 1 Wort oder 2 Worte, zwischen denen 1 Leerzeichen enthalten ist. Gibt an, wer bzw. wo der Versuch gemacht wurde. Gibt rund 20 Möglichkeiten, was dort stehen kann. Beispiel: Labor2UG, RaumtestRB, SimulationWL oder Langzeit LaborLA
"2001" gibt das Jahr an, aus dem der Versuch stammt.
"12-15" Monat & Tag des Versuchs
"15-05-01" Uhrzeit des Versuchs
Mein Problem ist, dass der 1. Teil "Versuch234" längenmässig alles von 5 bis 70 Zeichen lang sein kann, deswegen kann ich nicht einfach sagen, er soll alles bis Zeichen 10 als Ordnername nehmen und die Dateien da rein verschieben. Das einzige vernünftige Selektierungsargument ist "Station1", weil dort sicher der Teil "Versuch234" zu Ende ist und klar ist, um was es eigentlich geht. Denn was das Ganze für mich nicht einfacher macht, ist die Tatsache, dass verschiedene "Station1" zum Teil gleiche "Versuch234" gemacht haben, die natürlich im gleichen Ordner auftauchen sollten, so fern Versuch234 übereinstimmt.
Ich bin absolut kein Programmierer, sondern komme ausm Netzwerk-Bereich, soll heißen vor allem Verkabelung und Co. Ergo habe ich mir zwar diese Musterlösung hier ausm Forum angeschaut, aber komme nicht ganz klar damit.
Würde mich deswegen freuen, wenn sich jemand meines Problems annehmen würde und mir weiterhelfen könnte.
Ich bedanke mich bei euch und wünsche euch einen angenehmen Nachmittag.
Silver0409
P.S. Ich hoffe, ich habe diese Frage im richtigen Bereich gepostet, wenn nicht bitte sagen, wo er hingehört.
Ich habe ungeplanter Weise die Betreuung eines "Servers" mit Win 7 64it übernehmen dürfen, wo tausende Dateien in Ordnern liegen, die nicht sortiert sind. Es geht um mehrere TB, die auch noch in verschiedenen Partitionen verstreut liegen. Mein Vorgänger hatte da wohl ein System, aber ich kann leider keines erkennen. Und da er aufgrund von Krankheit ausgefallen und nicht ansprechbar ist, darf ich nun schauen, wie ich damit klar komme...
Es handelt sich immer um 2 Dateien, die zusammen gehören. Einmal die Datei selbst, meist eine .mpg und eine .txt, mit der Beschreibung, was die .mpg beinhaltet. Das Ziel ist es, dass alle Versuche, die zusammengehören in einem Ordner sind und man nicht erst 5 verschiedene Freigaben durchsuchen muss, um alle zusammengehörenden Files zu finden.
Mein Wunsch wäre es, eine Batch/Shell zu haben, die hingeht und die Daten, die zusammengehören in einen Ordner packt und damit das Chaos hier etwas reduziert. Das Problem ist, dass die Benennung der Daten totaler Murks ist. Die Dateinamen haben, soweit ich das mittlerweile überblicken kann ein ähnliches Schema wie folgt:
Versuch234 Station1 2001 12-15 15-05-01
Es wird fast ausschließlich mit Leerzeichen gearbeitet. Es werden zur Trennung der einzelnen Segmente keine Bindestriche, Unterstiche oder ähnliches verwendet.
"Versuch234" kann nur 1 Wort, aber auch ein Satz samt Gedankenstrich sein. Extrem-Beispiel: "Wir testen das neue Labor - hoffentlich geht alles"
"Station1" ist entweder 1 Wort oder 2 Worte, zwischen denen 1 Leerzeichen enthalten ist. Gibt an, wer bzw. wo der Versuch gemacht wurde. Gibt rund 20 Möglichkeiten, was dort stehen kann. Beispiel: Labor2UG, RaumtestRB, SimulationWL oder Langzeit LaborLA
"2001" gibt das Jahr an, aus dem der Versuch stammt.
"12-15" Monat & Tag des Versuchs
"15-05-01" Uhrzeit des Versuchs
Mein Problem ist, dass der 1. Teil "Versuch234" längenmässig alles von 5 bis 70 Zeichen lang sein kann, deswegen kann ich nicht einfach sagen, er soll alles bis Zeichen 10 als Ordnername nehmen und die Dateien da rein verschieben. Das einzige vernünftige Selektierungsargument ist "Station1", weil dort sicher der Teil "Versuch234" zu Ende ist und klar ist, um was es eigentlich geht. Denn was das Ganze für mich nicht einfacher macht, ist die Tatsache, dass verschiedene "Station1" zum Teil gleiche "Versuch234" gemacht haben, die natürlich im gleichen Ordner auftauchen sollten, so fern Versuch234 übereinstimmt.
Ich bin absolut kein Programmierer, sondern komme ausm Netzwerk-Bereich, soll heißen vor allem Verkabelung und Co. Ergo habe ich mir zwar diese Musterlösung hier ausm Forum angeschaut, aber komme nicht ganz klar damit.
Würde mich deswegen freuen, wenn sich jemand meines Problems annehmen würde und mir weiterhelfen könnte.
Ich bedanke mich bei euch und wünsche euch einen angenehmen Nachmittag.
Silver0409
P.S. Ich hoffe, ich habe diese Frage im richtigen Bereich gepostet, wenn nicht bitte sagen, wo er hingehört.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 313522
Url: https://administrator.de/contentid/313522
Ausgedruckt am: 22.11.2024 um 06:11 Uhr
11 Kommentare
Neuester Kommentar
Zitat von @Silver0409:
Hier gibt es keine Station?- Brandschutrprotokoll neu abgestimmt GeoLab KR 2013 03-17 11-12-00
- Druckvarianzen nach Neujustierung 01-07 09-25-00
Habe mal den Versuchteil ("Versuch234") fett und das Was/Wer ("Station1") unterstrichen markiert. Hoffe das ist repräsentativ genug.
Eigentlich schon. Gibt es eine Liste der Stationen anhand derer man abgleichen kann?Ansonsten kann man das schwerlich automatisieren.
Ich habe mal einen Entwurf gebastelt:
Die ini-Datei enthält die Namen der Stationen in diesem Format:
Skript:
Edit: Ordnerbennenung korrigiert
Die ini-Datei enthält die Namen der Stationen in diesem Format:
GeoLab
MtL
HornsteinA
clear-host
$source = "C:\Users\adm-sup-sb\Desktop\Powershell\RAW-Files"
$destinationparent = "C:\Users\adm-sup-sb\Desktop\Powershell\Destination\"
$ini = gc "C:\Users\adm-sup-sb\Desktop\Powershell\Station.ini"
$raw = gci $source
foreach ($r in $raw){
foreach ($i in $ini){
if($r -match $i ){
$versuch = $r -split $i
$foldername = $versuch
$destpath = "$destinationparent\$foldername"
$search = Test-Path $destpath
if ($search -eq $false){
New-Item $destpath -ItemType directory
}
Move-Item $source\$r -Destination $destpath
}
}
}
Edit: Ordnerbennenung korrigiert
Zitat von @Silver0409:
Danke für deine Arbeit!
Bei dem Code handelt es sich um eine Batch oder eine Shell? Bin da echt ein Noob…
Powershell; zum debugging würde ich dir empfehlen den Quelltext in die Powershell-ISE zu kopieren und auszuführen.Danke für deine Arbeit!
Bei dem Code handelt es sich um eine Batch oder eine Shell? Bin da echt ein Noob…
ein Update der Powershell könnte evtl. nötig sein (-> netFramework)
aktuelle Verison auf Win7 ist 4.0
$source = "C:\Users\adm-sup-sb\Desktop\Powershell\RAW-Files"
$destinationparent = "C:\Users\adm-sup-sb\Desktop\Powershell\Destination\"
Das ist der Ausgangsordner, indem er arbeiten soll, oder?$ini = gc "C:\Users\adm-sup-sb\Desktop\Powershell\Station.ini"
Das ist der Ort, wo die .ini abgelegt ist.Den Rest des Codes verstehe ich glaube ich soweit. Werde es mal ausprobieren, wenn die 2 Fragen von dir beantwortet wurden. Danke vielmals.
Ich empfehle die Pfade auf einen Test-Ordner anzupassen und nicht direkt an den live-daten herumzuspielen.
Zitat von @Silver0409:
Habe das Ganze an einem Schwung (ca. 500) Testdaten ausprobiert und es funkt an sich sehr gut.
freut michHabe das Ganze an einem Schwung (ca. 500) Testdaten ausprobiert und es funkt an sich sehr gut.
Leider gibt es noch 3 größere Probleme:
meh* doppelte Leerzeichen
Also Beispielsweise:
zur Verdeutlichung habe ich die Leerzeichen durch X ersetzt.
Brandschutrprotokoll neu abgestimmtXGeoLab KR 2013 03-17 11-12-00
Brandschutrprotokoll neu abgestimmtXXGeoLab KR 2013 03-17 11-12-00
Da macht die Shell natürlich 2 verschiedene Ordner draus.
kann ich bei mir nicht bestätigen.Also Beispielsweise:
zur Verdeutlichung habe ich die Leerzeichen durch X ersetzt.
Brandschutrprotokoll neu abgestimmtXGeoLab KR 2013 03-17 11-12-00
Brandschutrprotokoll neu abgestimmtXXGeoLab KR 2013 03-17 11-12-00
Da macht die Shell natürlich 2 verschiedene Ordner draus.
* "-" Zeichen ohne Sinn
Brandschutrprotokoll neu abgestimmt - GeoLab KR 2013 03-17 11-12-00
Brandschutrprotokoll neu abgestimmt GeoLab KR 2013 03-17 11-12-00
Das " - " im oberen Beispiel steht ohne Grund dort, aber die Powershell weiß das natürlich nicht und macht 2 verschiedene Ordner drauß, die sich durch " -" unterscheiden...
ist im anhängenden Skript behobenBrandschutrprotokoll neu abgestimmt - GeoLab KR 2013 03-17 11-12-00
Brandschutrprotokoll neu abgestimmt GeoLab KR 2013 03-17 11-12-00
Das " - " im oberen Beispiel steht ohne Grund dort, aber die Powershell weiß das natürlich nicht und macht 2 verschiedene Ordner drauß, die sich durch " -" unterscheiden...
* Wiederholungen von Teilbezeichnungen
Hier sind Informationen im Dateinamen doppelt, ich weis leider nicht warum oder von wem das so gemacht wurde.
Wüsste nicht, wie man das prüfen sollte.Hier sind Informationen im Dateinamen doppelt, ich weis leider nicht warum oder von wem das so gemacht wurde.
clear-host
$source = "C:\Users\User\Desktop\test\RAW-Files"
$destinationparent = "C:\Users\User\Desktop\test\Destination"
$ini = gc "C:\Users\User\Desktop\test\Station.ini"
$raw = gci $source
foreach ($r in $raw){
foreach ($i in $ini){
if($r -match $i ){
$versuch = $r -split $i
$foldername = $versuch
$foldername = $foldername.Replace("-","")
$destpath = "$destinationparent\$foldername"
$search = Test-Path $destpath
if ($search -eq $false){
New-Item $destpath -ItemType directory
}
Move-Item $source\$r -Destination $destpath
}
}
}