Kopieren Sie nur neuere Dateien von einem Ordner in einen anderen

8

Ich habe 2 Ordner mit Dateien. Diese Dateien sind das Produkt eines Erstellungsprozesses. Der erste Ordner ist die Ausgabe des vorherigen Builds, während der letztere die Ausgabe des aktuellen Builds ist .

Ich möchte diese beiden Ordner irgendwie von der Befehlszeile / dem Build-Skript unterscheiden und nur Dateien, die hinzugefügt wurden, oder Dateien, die neu sind, in einen anderen Ordner kopieren .

Zum Beispiel:

**FOLDER1** (new build)
a.txt
b.txt (modified)
c.txt
d.txt

**FOLDER2** (prev build)
a.txt
b.txt
c.txt

Basierend darauf kopiert der Kopiervorgang, an dem ich interessiert bin, nur b.txt und d.txt in einen anderen Ordner (nicht in Ordner2).

Grundsätzlich bin ich erst nach den "Deltas" und möchte diese irgendwo aufbewahren.

Ist dies mit Standard-Befehlszeilentools möglich, die mit Windows geliefert werden? (Angenommen, Windows 7 / Server 2008 oder höher)

liortal
quelle
Dies ist ein langer Umweg, aber vielleicht nur xcopymit gesetztem Datumsflag. Wenn b in F1 neuer als der neue Ordner ist, wird es kopiert, und wenn b in F2 neuer als in F1 ist, wird es auch kopiert. Bei großen Dateigrößen verschlechtert es sich also schnell (daher die Nichtantwort). Es kann sich lohnen , die Erforschung und eine gewisse Logik für ein tun .batmitxcopy /c/h/e/v/y/d
nerdwaller
Ich bin nicht nach dem Kopieren der Deltas nach FOLDER2. Ich möchte einen Ordner erstellen, der NUR DIE DELTAS enthält (kopiere sie irgendwie in FOLDER3).
Liortal
Das habe ich vorgeschlagen ... Sie würden zuerst Ordner1 gegen Ordner3 und dann Ordner2 gegen Ordner 3 überprüfen. Sie hätten immer die neueste Version in Ordner3 aller Dateien. Wie gesagt, bei großen Dateien ist dies jedoch äußerst ineffizient - daher habe ich es nicht als Antwort veröffentlicht.
Nerdwaller
Ordner3 wird immer als leer initialisiert. Ich möchte F1 und F2 vergleichen und die neuesten Inhalte nach F3 kopieren. F3 am Ende würde nur die neuesten Sachen enthalten.
Liortal
Wenn Sie F1 mit F3 und F2 mit F3 vergleichen, tun Sie dies im Wesentlichen, denn wenn F3 leer ist, erhalten Sie alle F1, dann könnten Sie F2 mit F3 (dh F1) vergleichen und Sie hätten die neueste. Wieder sehr ineffizient - es ist also keine Antwort ...
Nerdwaller

Antworten:

11

Verwenden Sie XCOPY mit den Optionen / D und / L und "kopieren" Sie von Ordner 1 nach Ordner 2.

Die Option / D beschränkt die Kopie nur auf neue oder geänderte Dateien.

Die Option / L bewirkt, dass der Befehl die Dateien auflistet, die kopiert werden sollen, verhindert jedoch, dass tatsächlich Kopien erstellt werden.

Verwenden Sie dann FOR / F, um diese Ergebnisse zu verarbeiten und die Dateien tatsächlich in Ordner 3 zu kopieren.

for /f "eol=: delims=" %F in ('xcopy /dl "folder1\*" "folder2"') do @copy "%F" "f3" >nul

Wenn es in eine Batch-Datei eingefügt wird, %müssen alle als verdoppelt werden %%.

Das XCOPY druckt auch eine Zusammenfassung aus, wie viele Dateien betroffen sind (wären). Das obige versucht, eine Datei mit der Zusammenfassung "Name" zu kopieren, und schlägt natürlich fehl. Die Umleitung der Ausgabe zu nul verhindert, dass die Fehlermeldung angezeigt wird. Ich habe unter Windows 7 getestet und war überrascht, dass die Fehlermeldung auf stdout und nicht auf stderr war. Wenn die Fehlermeldung in anderen Versionen auf stderr angezeigt wird, sollte der Befehl auch 2> nul erhalten, um die Fehlermeldung zu verhindern.

Es besteht jedoch die Gefahr, dass die Fehlermeldungen ausgeblendet werden. Was passiert, wenn eine Kopie aus irgendeinem Grund fehlschlägt?

Hier ist ein Skript, das alle Dateien auflistet, die erfolgreich kopiert wurden, und angibt, welche (falls vorhanden) fehlgeschlagen sind. Es verwendet FINDSTR, um die unerwünschte Anzahl von Dateien herauszufiltern. Es wird davon ausgegangen, dass die Anzahl der Dateien in Englisch mit dem Formular vorliegt NNN File(s), sodass sie für andere Sprachen geändert werden müssten.

@echo off
for /f "eol=: delims=" %%F in (
  'xcopy /dl "folder1\*" "folder2" ^| findstr /v "^[0-9][0-9]* File(s)"'
) do copy "%%F" "folder3" >nul && echo "%%F"|| echo FAILED: "%%f"

Hier ist eine komplexere Variante, die mit jeder Sprache funktioniert. Es speichert jeden Dateinamen in einer Variablen und verzögert die Kopie bis zur nächsten Schleifeniteration. Der letzte Eintrag (die Anzahl) wird nie kopiert.

@echo off
setlocal disableDelayedExpansion
set "file="
for /f "eol=: delims=" %%F in ('xcopy /dl "folder1\*" "folder2"') do (
  if defined file (
    setlocal enableDelayedExpansion
    copy "!file!" "folder3" >nul && echo "!file!" || echo FAILED: "!file!"
    endlocal
  )
  set "file=%%F"
)
Dbenham
quelle
Danke, ich denke, ich werde mit diesem Ansatz oder ähnlichem untergehen. Ich denke, XCOPY kopiert die Dateien weiterhin, falls sie dasselbe Datum haben (f1 und f2 enthalten genau dieselben Dateien und Daten - alle Dateien werden weiterhin kopiert).
Liortal
@liortal - Nicht ganz. Ich glaube, es macht genau das, was Sie wollen. Die Datei wird nur kopiert, wenn entweder die Datei in f1 und nicht in f2 vorhanden ist oder wenn der zuletzt geänderte Zeitstempel in f1 neuer als in f2 ist. Wenn der Zeitstempel in f1 gleich oder älter ist, wird die Datei nicht kopiert.
Dbenham
Versuchen Sie, 2 Ordner mit genau denselben Dateien einzurichten und mit xcopy / d zu kopieren. Nach dem, was ich gesehen habe, werden die Dateien in diesem Fall kopiert.
Liortal
Ich habe diesen Testfall gemacht und es hat funktioniert. Ich habe einen F1-Ordner mit Dateien erstellt und diese Dateien dann nach F2 kopiert. Dann habe ich eine Datei in F1 geändert. COPY / D kopiert nur die geänderte Datei.
Dbenham
Was ist der Grund dafür, xcopy nicht nur direkt zu verwenden? Wenn es die erforderlichen Dateien auflisten kann, kann es dann nicht auch die erforderlichen Dateien kopieren?
trlkly
2

Ich mag stattdessen ROBOCOPY. XCOPY wurde jahrelang verwendet und stellte dann fest, dass ein neu startbarer Kopiervorgang über eine langsame / zuckende Internetverbindung erforderlich ist.

ROBOCOPY src dest / s / e / xo

oder Spiegel

ROBOCOPY src dest / mir

Verwenden Sie die Protokollierungsoptionen, um Ihre Liste später zur Prüfung zu erhalten.

ROBOCOPY src dest / s / e / xo / log: Datei

Joe
quelle
Laut Robocopy-Hilfe sollte die Option / s redundant sein, wenn Sie / e verwenden. Davon abgesehen halte ich das für eine gute Lösung!
Rikki-Tikki-Tavi