BATCH-Datei zur zufälligen Auswahl von Dateien
Hallo zusammen,
vorweg - ich bin kein richtiger Programmierer. Als Jugendlicher - zu DOS-Zeiten - habe ich mit BATCH-Dateien kleine Rollenspiele gebastelt, ich dachte immer ich kann das ein bisschen - aber anscheinend ist dem nicht wirklich so ;)
Ich möchte gerne aus einer großen Menge an Dateien eine bestimmte Anzahl zufällig auswählen und in ein anderes Verzeichnis kopieren. Hintergrund für die Praktiker: Es handelt sich dabei um JPG-Dateien von handgeschriebenen Protokollen, die zufällig und anonymisiert kontrolliert werden sollen. Die Anonymisierung habe ich derzeit über einen Batch-Vorgang in IrfanView gelöst. Die Auswahl der JPG-Dateien ist aktuell noch mein Problem. Für die Thematik "zufällige Auswahl von Dateien" hab ich eine Menge Lösungsvorschläge finden können, leider haben die alle nicht funktioniert - denn jetzt kommt die Schwierigkeit meines Problems:
- Die Ursprungsdaten liegen in Unterverzeichnissen, innerhalb dieser Unterverzeichnisse sind die Dateien nach dem gleichen System benannt - die Dateinamen können also mehrfach auftreten
- zu jedem Protokoll gibt es immer drei JPGs (fiktiver Dateiname): XYZ001.jpg, XYZ001_a.jpg und XYZ001_b.jpg - ich benötige immer nur die XYZ001.jpg ohne dem _a oder _b
- Mit den bisherigen Lösungsansätzen konnte ich nicht mehr nachvollziehen, aus welchem Unterordner die Dateien kopiert wurden. Ebenso hatte ich ein Problem bei doppelten Dateinamen und natürlich hatte ich auch viele JPGs mit dem _a oder _b hinten dran.
Jetzt habe ich gelesen, ich kann per Batch auch eine Art Logfile erstellen lassen, da bin ich aber garnicht richtig weitergekommen. Theoretisch würde es aber auch vollkommen ausreichen wenn die Datei so umbenannt wird, dass der Unterordner rückverfolgbar ist. Letzteres darf nur nicht offensichtlich sein. Also die Dateien aus Unterordner "01" müsste sich z.B. in XYZ001_ABC.jpg, XYZ002_ABC.jpg, usw... umbenennen. Also immer ein ABC bei Unterordner 01, ein KWM bie 02, usw... Dann ist ja nur durch das Wissen dieser Umbenennung eine Rückverfolgung möglich. Bei letzterer Idee wäre auch das Problem mit den doppelten Dateinamen vom Tisch, aber hier tappe ich dann völlig in der Planlosigkeit herum, wie das umzusetzen ist.
Ich bin für jede Hilfe dankbar. Wenn mein Problem zu komplex ist, um in einem Forum dazu Hilfestellung zu geben, sagt das ruhig ;)
Ggf. kennt auch jemand ein fertiges Tool, was diese Anforderungen gerecht wird.
Grüße aus München
vorweg - ich bin kein richtiger Programmierer. Als Jugendlicher - zu DOS-Zeiten - habe ich mit BATCH-Dateien kleine Rollenspiele gebastelt, ich dachte immer ich kann das ein bisschen - aber anscheinend ist dem nicht wirklich so ;)
Ich möchte gerne aus einer großen Menge an Dateien eine bestimmte Anzahl zufällig auswählen und in ein anderes Verzeichnis kopieren. Hintergrund für die Praktiker: Es handelt sich dabei um JPG-Dateien von handgeschriebenen Protokollen, die zufällig und anonymisiert kontrolliert werden sollen. Die Anonymisierung habe ich derzeit über einen Batch-Vorgang in IrfanView gelöst. Die Auswahl der JPG-Dateien ist aktuell noch mein Problem. Für die Thematik "zufällige Auswahl von Dateien" hab ich eine Menge Lösungsvorschläge finden können, leider haben die alle nicht funktioniert - denn jetzt kommt die Schwierigkeit meines Problems:
- Die Ursprungsdaten liegen in Unterverzeichnissen, innerhalb dieser Unterverzeichnisse sind die Dateien nach dem gleichen System benannt - die Dateinamen können also mehrfach auftreten
- zu jedem Protokoll gibt es immer drei JPGs (fiktiver Dateiname): XYZ001.jpg, XYZ001_a.jpg und XYZ001_b.jpg - ich benötige immer nur die XYZ001.jpg ohne dem _a oder _b
- Mit den bisherigen Lösungsansätzen konnte ich nicht mehr nachvollziehen, aus welchem Unterordner die Dateien kopiert wurden. Ebenso hatte ich ein Problem bei doppelten Dateinamen und natürlich hatte ich auch viele JPGs mit dem _a oder _b hinten dran.
Jetzt habe ich gelesen, ich kann per Batch auch eine Art Logfile erstellen lassen, da bin ich aber garnicht richtig weitergekommen. Theoretisch würde es aber auch vollkommen ausreichen wenn die Datei so umbenannt wird, dass der Unterordner rückverfolgbar ist. Letzteres darf nur nicht offensichtlich sein. Also die Dateien aus Unterordner "01" müsste sich z.B. in XYZ001_ABC.jpg, XYZ002_ABC.jpg, usw... umbenennen. Also immer ein ABC bei Unterordner 01, ein KWM bie 02, usw... Dann ist ja nur durch das Wissen dieser Umbenennung eine Rückverfolgung möglich. Bei letzterer Idee wäre auch das Problem mit den doppelten Dateinamen vom Tisch, aber hier tappe ich dann völlig in der Planlosigkeit herum, wie das umzusetzen ist.
Ich bin für jede Hilfe dankbar. Wenn mein Problem zu komplex ist, um in einem Forum dazu Hilfestellung zu geben, sagt das ruhig ;)
Ggf. kennt auch jemand ein fertiges Tool, was diese Anforderungen gerecht wird.
Grüße aus München
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 666378
Url: https://administrator.de/forum/batch-datei-zur-zufaelligen-auswahl-von-dateien-666378.html
Ausgedruckt am: 08.04.2025 um 06:04 Uhr
8 Kommentare
Neuester Kommentar

Machs doch gleich mit Powershell
Nach deinem Schema:
Alternative dazu ohne fest hinterlegtes Schema sondern mit Logdatei in der die Dateinamens Zuordnung abgelegt wird und Ticks als Randomizer im Dateinamen.
Gruß w.
Nach deinem Schema:
# quellordner
$quelle = 'D:\quelle'
# Zielordner (hier werden die Dateien hin kopiert
$ziel = 'D:\ziel'
# Anzahl der auszuwählenden Dateien
$randomcount = 2
# Zuordnung zu Ordnernamen definieren
$map = @{
'01' = 'ABC'
'02' = 'KWM'
}
# ab geht's ...
ls $quelle -File -Filter *.jpg -Recurse | ?{$_.Basename -notmatch '_[ab]$'} | get-random -Count $randomcount | copy-item -Destination {(join-path $ziel "$($_.BaseName)_$($map[$_.Directory.Name])$($_.Extension)")} -verbose
# quellordner
$quelle = 'D:\quelle'
# Zielordner (hier werden die Dateien hin kopiert
$ziel = 'D:\ziel'
# Logdatei in der die Zuordnung der Quelle zur Zieldatei notiert wird
$log = 'D:\copylog.csv'
# Anzahl der auszuwählenden Dateien
$randomcount = 2
# ab geht's ...
ls $quelle -File -Filter *.jpg -Recurse -PipelineVariable file | ?{$_.Basename -notmatch '_[ab]$'} | get-random -Count $randomcount | %{
copy-item $_.FullName -Destination (join-path $ziel "$($_.BaseName)_$([datetime]::Now.Ticks)$($_.Extension)") -PassThru | select @{n='Source';e={$file.Fullname}},@{n='Target';e={$_.Fullname}} | Export-CSV $log -Delimiter ";" -NoType -Encoding UTF8 -Append
}
Warum darf denn die Rückverfolgbarkeit des Unterordners nicht offensichtlich sein? Sind denn die Unterordner bzw. ihre Zuordnung offensichtlich?
Für denjenigen, z.B. für Dich, der das Mapping 01 -> ABC, 02 -> ... in Deinem Script fest verdrahtet, ist natürlich die Zuordnung offensichtlich, weil er das Mapping schlichtweg kennt. Dem könntest Du nur begegnen, wenn das Mapping selbst mit zufälligen Zuweisungen agiert. Dann müsste das Mapping natürlich irgendwo dokumentiert werden, wenn zu einem späteren Zeitpunkt eine Rückverfolgung (manuell oder automatisch) erfolgen soll.
Wann ist denn eine Rückverfolgung überhaupt erforderlich? Welches Ziel soll mittels einer Rückverfolgung erreicht werden?
Viele Grüße
HansDampf06
Für denjenigen, z.B. für Dich, der das Mapping 01 -> ABC, 02 -> ... in Deinem Script fest verdrahtet, ist natürlich die Zuordnung offensichtlich, weil er das Mapping schlichtweg kennt. Dem könntest Du nur begegnen, wenn das Mapping selbst mit zufälligen Zuweisungen agiert. Dann müsste das Mapping natürlich irgendwo dokumentiert werden, wenn zu einem späteren Zeitpunkt eine Rückverfolgung (manuell oder automatisch) erfolgen soll.
Wann ist denn eine Rückverfolgung überhaupt erforderlich? Welches Ziel soll mittels einer Rückverfolgung erreicht werden?
Viele Grüße
HansDampf06

Moin,
Du musst nicht Stundenlang im Netz suchen.
Das Forum hat alles, was du brauchst.
Powershell - Leitfaden für Anfänger
Für deine multiplen Quellen, schau dir den Link über Arrays an.
Gruß
C.C.
Du musst nicht Stundenlang im Netz suchen.
Das Forum hat alles, was du brauchst.
Powershell - Leitfaden für Anfänger
Für deine multiplen Quellen, schau dir den Link über Arrays an.
Gruß
C.C.