• Herzlich willkommen im "neuen" DSLR-Forum!

    Wir hoffen, dass Euch das neue Design und die neuen Features gefallen und Ihr Euch schnell zurechtfindet.
    Wir werden wohl alle etwas Zeit brauchen, um uns in die neue Umgebung einzuleben. Auch für uns ist das alles neu.

    Euer DSLR-Forum-Team

  • In eigener Sache!

    Liebe Mitglieder, liebe Besucher und Gäste
    ich weiß, es ist ein leidiges Thema, aber ich muss es ansprechen: Werbung, Werbeblocker und Finanzierung des Forums.
    Bitte hier weiterlesen ...

  • DSLR-Forum Fotowettbewerb neu erfunden!
    Nach wochenlanger intensiver Arbeit an der Erneuerung des Formates unseres internen Fotowettbewerbes ist es Frosty als Moderator
    und au lait als Programmierer gelungen, unseren Wettbewerb auf ein völlig neues Level zu heben!
    Lest hier alle Infos zum DSLR-Forum Fotowettbewerb 2.0
    Einen voll funktionsfähigen Demowettbewerb kannst du dir hier ansehen.
  • Neuer Partner: AkkuShop.de
    Akkus, Ladegeräte und mehr (nicht nur) für Digitalkameras und Drohnen
  • Neuer Gutscheincode unseres Partners Schutzfolien24:
    DSLR-Forum2024
    Dauerhaft 10% Rabatt auf alle Displayschutzfolien der Eigenmarken "Upscreen", "Brotec", "Savvies".
    Der Code ist für alle Geräteklassen gültig.
  • Stimmt ab über die Sieger des DSLR-Forum Fotowettbewerbs April 2024.
    Thema: "Sprichwörtlich"

    Nur noch bis zum 30.04.2024 23:59!
    Jeder darf abstimmen!
    Zur Abstimmung und Bewertung hier lang
WERBUNG

Software zum Kopieren und verschieben von Bilddateien

ChristopherFoto

Themenersteller
Hallo zusammen,

ich suche eine Software mit der ich Bilddateien automatisiert kopieren und verschieben kann.

Vorhandene Dateien die immer da ist:
e:\TEMP-von-Speicherkarte\2018-12-10_11-15-36_DSC_1234.NEF

Dateien die vorhanden sein können, je nach verwendeter Software (CaptureOne, Nikon Capture-NX-D, DxO PhotoLab):
e:\TEMP-von-Speicherkarte\2018-12-10_11-15-36_DSC_1234.xmp
e:\TEMP-von-Speicherkarte\2018-12-10_11-15-36_DSC_1234.NEF.dop
e:\TEMP-von-Speicherkarte\NKSC_PARAM\2018-12-10_11-15-36_DSC_1234.NEF.nksc
e:\TEMP-von-Speicherkarte\CaptureOne\Settings110\2018-12-10_11-15-36_DSC_1234.NEF.cos
e:\TEMP-von-Speicherkarte\CaptureOne\Cache\Proxies\2018-12-10_11-15-36_DSC_1234.NEF.cof
e:\TEMP-von-Speicherkarte\CaptureOne\Cache\Proxies\2018-12-10_11-15-36_DSC_1234.NEF.cop

Zu erfüllende Herausforderungen

1. Zielordner muss verwendet bzw. wenn nicht vorhanden angelegt werden nach dem Schema "Aufnahmejahr" -"Aufnahmejahr-Monat" (D:\Bilder\NEF\ bzw. Z:\Bilder-Backup\NEF\ ist vorgegeben)
Beispiel für die oben genante Bilddatei D:\Bilder\NEF\2018\2018-12
Für die Backup-Datei Z:\Bilder-Backup\NEF\2018\2018-12

2. Alle zu der Bilddatei gehörenden Dateien in den Unterverzeichnissen sollen mit kopiert werden und auch wieder in der gleichen Verzeichnisunterstrucktur landen

Beispiel nach dem Kopieren / verschieben
D:\Bilder\NEF\2018-12-10_11-15-36_DSC_1234.NEF
D:\Bilder\NEF\2018-12-10_11-15-36_DSC_1234.xmp
D:\Bilder\NEF\2018-12-10_11-15-36_DSC_1234.NEF.dop
D:\Bilder\NEF\NKSC_PARAM\2018-12-10_11-15-36_DSC_1234.NEF.nksc
D:\Bilder\NEF\CaptureOne\Settings110\2018-12-10_11-15-36_DSC_1234.NEF.cos
D:\Bilder\NEF\CaptureOne\Cache\Proxies\2018-12-10_11-15-36_DSC_1234.NEF.cof
D:\Bilder\NEF\CaptureOne\Cache\Proxies\2018-12-10_11-15-36_DSC_1234.NEF.cop

Z:\Bilder-Backup\NEF\2018-12-10_11-15-36_DSC_1234.NEF
Z:\Bilder-Backup\NEF\2018-12-10_11-15-36_DSC_1234.xmp
Z:\Bilder-Backup\NEF\2018-12-10_11-15-36_DSC_1234.NEF.dop
Z:\Bilder-Backup\NEF\NKSC_PARAM\2018-12-10_11-15-36_DSC_1234.NEF.nksc
Z:\Bilder-Backup\NEF\CaptureOne\Settings110\2018-12-10_11-15-36_DSC_1234.NEF.cos
Z:\Bilder-Backup\NEF\CaptureOne\Cache\Proxies\2018-12-10_11-15-36_DSC_1234.NEF.cof
Z:\Bilder-Backup\NEF\CaptureOne\Cache\Proxies\2018-12-10_11-15-36_DSC_1234.NEF.cop


IMatch kann das, allerdings würde ich dies gerne in einer eigenen Anwendung erledigen.

Habe schon "Advanced renamer", "Bulk Rename Utility" und "WIA-Loader" ausprobiert. Am weitesten bin ich mit "Advanced renamer" gekommen allerdings bin ich hier an der Zielverzeichnisstrucktur gescheitert

Hat jemand eine Idee wie ich das hinbekomme?

Danke für die Unterstützung
 
Hmm, wenn das Muster der Dateinamen immer mit "YYYY-MM" beginnt, ist das eigentlich ein Kinderspiel.
An deinen Pfadangaben kann man sehen, das Du Windows benutzt.
Ich würde also ein paar wenige Zeilen Powershell nutzen...
 
sowas zum Beispiel:

Code:
$src = "C:\temp\ise"
$backup = "C:\Temp"

Get-ChildItem -Recurse -Filter "*.*" -Path $src | ForEach-Object {

    # extrahiere Jahr und Monat aus dem Dateinamen
    $year = $_.ToString().Substring(0,4)
    $month = $_.ToString().Substring(5,2)

    # jetzt splitte den Pfad auf, damit man ihn unterhalb $dest wieder zusammenbauen kann
    $tokens = $src.Split("\")

    # baue den Zielpfad
    $dest = $backup
    for($i=1; $i -lt $tokens.Length; $i++) {
        $dest = "$dest\$($tokens[$i])"
    }

    # $dest beginnt jetzt mit dem Backup-Pfad und endet mit
    # der Ordnerstruktur des Quellpfades
    $dest = "$dest\$year\$month"

    # nur zu Ausgabe
    write-host $dest

    # Wenn alles passt einfach das obige write-host kommentieren und in den nächsten
    # beiden Zeilen die # entfernen - i.e. Kommentarzeichen entfernen
    #New-Item -ItemType Directory -Path "$dest" -ErrorAction SilentlyContinue
    #Copy-Item -Path $_.FullName -Destination $dest
}
 
Zuletzt bearbeitet:
Wenn ich dich recht verstanden habe, soll die Verzeichisstruktur auf beiden Seiten gleich sein. Dann bietet sich ein Synchronisationstool an.
Davon gibt es reichlich:
http://www.chip.de/Downloads-Downlo...6820739.html?xbl_category=tag_synchronisation
z.B. FreeFileSync, Robocoby, Total Commander usw. usw.
Welches jetzt das beste ist, könnte eine längere Diskussion auslösen.
 
Hallo,

erst mal danke für eure Antworten.
Eine Sache hatte ich vergessen, es kann vorkommen, das in den Unterordnern Zusatzdateien liegen, zu denen es die Hauptdatei nicht mehr gibt, da diese bereits gelöscht wurde. Diese Zusatzdateien möchte ich auf keinen Fall mit Kopieren.

Gruß Christopher
 
Eine Sache hatte ich vergessen, es kann vorkommen, das in den Unterordnern Zusatzdateien liegen, zu denen es die Hauptdatei nicht mehr gibt, da diese bereits gelöscht wurde. Diese Zusatzdateien möchte ich auf keinen Fall mit Kopieren.

Das ist ja kein Problem, du musst einfach zuerst die *.NEFs suchen und dann alle (bis auf das Suffix) gleichnamigen verschieben.
 
Ich denke nicht, das die Anforderungen durch eine Lösung von der Stange erschlagen werden können.
Die gängigen Mirror-Lösungen wie robocopy können keinen Pfad aus einem Dateinamenmuster erstellen.
Wenn die Speicherkarte natürlich immer mit Dateien vom gleichen Tag befüllt ist, spielt das natürlich keine Rolle. Dann könnte man einfach spiegeln.
Wenn da nicht die Anforderung wäre, nur die Dateien zu kopieren, die auch ein existierendes .nef haben.

Ich habe da nochmal was zusammen gestrickt. Auf das Bauen des Quellpfades im Backup-Ordner habe ich jetzt mal verzichtet. Aber natürlich werden die Ordner-Pfade übernommen.
Ich habe die oben gezeigte Dateistruktur testweise bei mir angelegt und das Skript funktioniert so.
Löschen bzw. verschieben tut das Skript aber nicht sondern kopiert nur.
Das Löschen überlasse ich dem TE. Zum Testen einfach die Powershell ISE öffnen und das Skript da reinkopieren. Quell und Zielpfad anpassen.
Ein Klick auf den grünen Pfeil startet das Programm (siehe Screenshot).

PS: Die Fehlerbehandlung ist noch ausbaufähig :rolleyes:

Code:
# Grundeinstellungen
# die kann und muss man anpassen
$srcPath = "C:\Temp"
$backupPath = "E:\Temp"

# Dateiendung
$extension = "*.nef" # Endung der RAW Datei
$extensions = @("*.cos", "*.cof", "*.cop", "*.nksc", "*.dop") # der Rest

# speichern der NEF Dateinamen (ohne Pfad)
$nefs = @()

#
# extrahiert aus dem kompletten Dateinamen die Datumswerte,
# baut den Backup Pfad und liefert diesen zurück
#
function build_backup_path([string]$fullFilename) {
    # extrahiere Jahr und Monat aus dem Dateinamen
    $fileName = [System.IO.Path]::GetFileName($fullFilename)
    $year = $fileName.Substring(0,4)
    $month = $fileName.Substring(0,7)
    $path = [System.IO.Path]::GetDirectoryName($fullFilename)
    # entferne den $src Anteil von $path
    $path = $path.Substring($srcPath.Length);
    #write-host "PATH nachher " $path
    # packe $backup davor
    if($path.Length -gt 0) {
        return "$backupPath\$year\$month$path"
    } else {
        return "$backupPath\$year\$month"
    }
}

#
# $srcPath ist der volle Pfad zur Quelldatei
# $destPath ist ein Verzeichnispfad ohne Dateiname
#
function copy_file([string]$srcPath, [string]$destPath) {
    $fileName = [System.IO.Path]::GetDirectoryName($srcPath)
    Copy-Item -Path $srcPath -Destination "$destPath"
    return $?
}

function mkdir([string]$s) {
    New-Item -ItemType Directory -Path "$s" -ErrorAction SilentlyContinue | Out-Null
}

function strip_ext([string]$s) {
    $len = [System.IO.Path]::GetExtension($s)
    return $s.ToString().SubString(0, $s.ToString().Length-$len.Length)
}

# RAW's kopieren
Get-ChildItem -Path $srcPath -Filter $extension | ForEach-Object {
    
    $nef = $_ # Dateiname sichern
    $destPath = build_backup_path $_.FullName
    mkdir $destPath
    $ok = copy_file $_.FullName $destPath

    # alles gut gegangen?
    if($ok) {
        Write-Host "Original-Datei $($_.FullName) nach $destPath kopiert"
        $nefs += $nef.ToString()
    }
}

# jetzt die restlichen Dateien basierend auf den aufgezeichneten Raw's
Get-ChildItem -Path $srcPath\* -Include $extensions -Recurse | ForEach-Object {
    $f = strip_ext $_
    $ff = [System.IO.Path]::GetFileName($f)
    if($nefs.Contains($ff)) {
        $destPath = build_backup_path $_.FullName
        mkdir $destPath
        $ok = copy_file $_.FullName $destPath
        if($ok) {
            Write-Host "Datei $($_.FullName) nach $destPath kopiert"
        }
    }
}
 

Anhänge

  • screen_2018-12-12__18-34-18.png
    Exif-Daten
    screen_2018-12-12__18-34-18.png
    478,8 KB · Aufrufe: 15
wenn es automatisch + Quelle=Ziel sein soll, werfe ich mal BitTorrent Sync (oder jetzt resilio) in den Raum.

bitte nicht verwechseln mit dem "bösen" BitTorrent, auch wenn es technisch ähnlich ist.

einfach mal anschauen, ich find das super zum syncen....
 
Zuletzt bearbeitet:
Powershell.

Fuer Google: powershell if else move-item rename-item

Mit Einlesen ist das an einem ruhigen Abend erledigt.

Die Hauptarbeit ist wohl, deine Anforderungen und Bedingungen in eine saubere Form zu bringen. Der code danach ist simpel.

Mit Erstellung des Aufgabenkatalogs, Entwicklung und Test im Produktionsbetrieb kann ich dir das fuer Stundensatz (100 Euro) x 2 Stunden = 200 Euro anbieten. Ist nicht ganz ernst gemeint :).


PS (hehe): Kleiner Trick:

new-item -path “c:\a\b\c” -type directory

...erzeugt direkt die komplette Pfadstruktur mit Ordnern a, b und c.
 
Zuletzt bearbeitet:
Code:
# $srcPath ist der volle Pfad zur Quelldatei
# $destPath ist ein Verzeichnispfad ohne Dateiname

bewaehrt haben sich hier im Betrieb Variablennamen nach dem Muster

$fooFile (nur datei und Endung)

$fooPath (pfad ohne datei, mit oder ohne trailing Backslash handelt PS eigentlich gut automatisch...)

$fooFullPath (pfad mit datei und endung)
 
WERBUNG
Zurück
Oben Unten