Kopieren Sie Dateien aus einem Ordner in mehrere andere Ordner, aus denen diese Dateien ursprünglich stammen. Windows

Kopieren Sie Dateien aus einem Ordner in mehrere andere Ordner, aus denen diese Dateien ursprünglich stammen. Windows

Hallo, ich habe folgendes Problem

Angenommen, Sie haben eine Windows-Ordnerstruktur mit verschiedenen Dateien (alle Dateien haben unterschiedliche Namen, können aber die gleiche Erweiterung haben):

dirA
  subDirA
    file1.png
    file2.dds
  file3.jpeg
dirB
  subDirB
    subSubDirB
      file4.tiff
    some_txt.txt
  test.cfg
final.docx

Und nun kopierst du alle Dateien rekursiv in ein anderes Verzeichnis:

file1.png
file2.dds
file3.jpeg
file4.tiff
some_txt.txt
test.cfg
final.docx

Und jetzt möchte ich alle diese Dateien zurück in ihre ursprünglichen Ordner kopieren (beachten Sie, dass die vorherigen Ordner und Dateien noch da sind, ich habe sie nur kopiert) und die vorherigen Dateien überschreiben. In Wirklichkeit sind es sehr viele Dateien, daher ist es keine Option, sie manuell zu bearbeiten.

Gibt es eine einfache Möglichkeit, dies zu tun, oder sollte ich hierfür besser ein benutzerdefiniertes Programm/Skript schreiben?

Antwort1

Normalerweise würde ich für so etwas eine Batch-Lösung bevorzugen:

@echo off

set "orig=C:\Original\Directory"
set "dir=C:\Some\Directory"

for /r "%orig%" %%A in (*) do (
    if exist "%dir%\%%~nxA" copy /y "%dir%\%%~nxA" "%%A"
)

Die origVariable ist der oberste Ordner, den Sie rekursiv durchlaufen möchten (d. h. dirAoder dirBaus Ihrem Beispielblock – oder wenn sie einen Ordner gemeinsam nutzen, können Sie so hoch gehen, wie Sie möchten, solange Sie sicher sind, dass es keine doppelten Namen gibt). Die dirVariable ist der Ordner, in den Sie zuvor alle Dateien kopiert haben.

for /rSchleifen durchalleDateien, die in einem Verzeichnis verwurzelt sind (also origalle seine Unterordner); für jede Iteration setzt es den vollständigen Pfad und die Erweiterung der Datei als %%A, dann prüfen wir innerhalb der Schleife, ob %%~nxA(die Datei, reduziert auf ihren Namen und ihre Erweiterung) an unserem dirSpeicherort existiert; wenn sie existiert, kopieren wir diese Datei von dirüber sich selbst an den origSpeicherort. Das ist alles. Wenn Sie zur Überprüfung eine Protokolldatei erstellen möchten, empfehle ich normalerweise die Verwendung von robocopy und lasse alles aus der Schleife in eine Textdatei ausgeben, die wie folgt aussehen würde:

@echo off

set "orig=C:\Original\Directory"
set "dir=C:\Some\Directory"

setlocal enabledelayedexpansion
for /r "%orig%" %%A in (*) do (
    set "path=%%~dpA"
    if exist "%dir%\%%~nxA" robocopy "%dir%" "!path:~0,-1!" "%%~nxA"
)>>"%dir%\Return Files.txt"

Der einzige knifflige Unterschied besteht darin, die verzögerte Erweiterung zu aktivieren, sodass Sie das Nachkomma abschneiden \können %%~dpA.

Antwort2

Was Sie tun möchten, ist unmöglich: Die Dateien an ihrem neuen Speicherort enthalten nicht mehr die Information, woher sie stammen. Das bedeutet, dass ein Skript nicht wissen kann, wo es jede Datei ablegen soll.

Wenn Sie über einen alten Verzeichniseintrag verfügen, lässt sich dies problemlos mit einer Skriptsprache erledigen.

Antwort3

Wenn Sie garantieren, dass es keine Namensduplikate gibt, verwenden Sie etwas wie

forfiles /P X:\originals_folder /S /C "cmd /c copy Y:\copies_folder\@file @path\@file /Y"

Antwort4

Eine PowerShell-Lösung, die eine Hashtabelle zum Nachschlagen von Pfaden verwendet:

$originals = 'c:\originals'
$copies    = 'c:\copies'
$hash = @{}
gci $originals -recurse | %{
   $hash[$_.name] = $_.Fullname
}
gci $copies | %{copy-item $_ $hash[$_.Name] -force

verwandte Informationen