題 僅將較新的文件從一個文件夾複製到另一個文件夾


我有2個文件夾。這些文件是某些構建過程的產物。 第一個文件夾是輸出 以前的構建 而後者則是後者的輸出 目前的建設

我想以某種方式從命令行/構建腳本和副本中區分這兩個文件夾 僅包含已添加的文件 或其他文件夾中的新文件。

例如:

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

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

基於此,我感興趣的複制操作只會將b.txt和d.txt複製到其他文件夾中(而不是複製到folder2中)。

基本上,我只是在“三角洲”後,我想存儲這些地方。

這是否可以使用Windows附帶的標準命令行工具? (假設Windows 7 / Server 2008或更高版本)


7
2017-12-17 14:54


起源


這是一個漫長的迂迴方式,但也許只是 xcopy 設置日期標誌。但是,如果F1中的b比newfolder更新,它將復制,如果F2中的b比F1中的更新 - 它也會復制。因此,對於大型文件大小,它會快速降級(因此無應答)。值得研究和做一些邏輯 .bat同 xcopy /c/h/e/v/y/d - nerdwaller
我不是在將三角洲複製到FOLDER2之後。我想創建一個只包含DELTAS的文件夾(以某種方式將它們複製到FOLDER3)。 - liortal
這就是我的建議......你首先檢查Folder1 vs Folder3然後Folder2 vs Folder 3.你總是會在Folder3中找到所有文件的最新版本。但是,正如我所說,對於大文件大小,這是非常低效的 - 所以我沒有將其作為答案發布。 - nerdwaller
Folder3始終初始化為空。我想比較F1和F2,並將最新的東西複製到F3。最後的F3只包含最新的東西。 - liortal
如果你比較F1到F3和F2到F3,你基本上就是這樣,因為如果F3是空的你得到了所有的F1,那麼你可以比較F2和F3(即F1)並且你有最新的。再次,非常低效 - 所以這不是答案...... - nerdwaller


答案:


將XCOPY與/ D和/ L選項一起使用,從文件夾1“複製”到文件夾2。

/ D選項將副本限制為僅新文件或已修改文件。

/ L選項使命令列出要復制的文件,但阻止實際製作任何副本。

然後使用FOR / F處理這些結果並實際將文件複製到文件夾3。

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

如果放入批處理文件,那麼全部 % 必須翻倍為 %%

XCOPY還打印出受影響的文件數量的摘要。以上將嘗試使用摘要計數“name”複製文件,當然也會失敗。將輸出重定向到nul可防止顯示錯誤消息。我在Windows 7上測試過,並且感到驚訝的是錯誤消息是在stdout而不是stderr。如果其他版本上的錯誤消息出現在stderr上,那麼該命令也應該得到2> nul以防止出現錯誤消息。

但隱藏錯誤消息存在風險 - 如果復制因某種原因失敗會怎樣?

這是一個腳本,它將列出已成功複製的所有文件,並指出哪些(如果有)失敗。它使用FINDSTR過濾掉不需要的文件計數。它假設文件計數是英文,帶有表格 NNN File(s),因此必須針對其他語言進行修改。

@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"

這是一個更複雜的變體,適用於任何語言。它將每個文件名保存到變量中,並將副本延遲到下一個循環迭代。最後一個條目(計數)永遠不會被複製。

@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"
)

9
2017-12-17 23:08



謝謝,我想我會採用這種方法或類似方式。我認為XCOPY仍會復製文件以防它們具有相同的日期(f1和f2包含完全相同的文件和日期 - 所有文件仍將被複製)。 - liortal
@liortal - 不太好。我相信它完全符合你的要求。僅當文件存在於f1而不是f2中時,或者如果f1中的最後修改時間戳比f2中的更新時,才複製該文件。如果f1中的時間戳相同或更舊,則不會復制該文件。 - dbenham
嘗試使用完全相同的文件設置2個文件夾並使用xcopy / d進行複制。從我所看到的,它複製了這種情況下的文件。 - liortal
我做了那個測試用例,但它確實有效。我用文件創建了F1文件夾,然後將這些文件複製到F2。然後我修改了F1中的一個文件。 COPY / D僅複製修改後的文件。 - dbenham
不僅僅直接使用xcopy的原因是什麼?如果它可以列出必要的文件,是否也可以復制必要的文件? - trlkly


我喜歡ROBOCOPY。使用XCOPY多年後,發現需要通過緩慢/顫抖的互聯網連接進行可重新啟動的複制操作。

ROBOCOPY src dest / s / e / xo

或鏡子

ROBOCOPY src dest / mir

使用“記錄”選項可以在以後獲取列表以供檢查。

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


0
2018-04-21 03:45