批次檔複製將原始文件保留在其他資料夾中的文件

批次檔複製將原始文件保留在其他資料夾中的文件

例如我有資料夾:

F1\F11\some files...
F1\F12\some files...
F1\F12\F121\some files..

我還有另一個結構

F2\F21\some files...
F2\F22\some files...
F2\F22\folder\some files...

資料夾名稱F11- F21F12F22是相等的。

資料夾中的檔案比F21,中的檔案F22F11F12

我需要遞歸F2複製F1,但將被替換的檔案 - 應保存在備份資料夾中:

Fbackup\F11\those files..
Fbackup\F12\those files..

這是為了能夠對該副本進行「撤消」操作所必需的。例如,我已經遞歸F2複製F1,然後將 Fbackup 複製到F1並且我有原始的F1.

答案1

如果您願意使用 Unix shell,這裡有一些使用bash我自己的 C shell 的替代方案。

C殼解決方案

您可以這樣做漢密爾頓 C 殼, 包括免費版本:

cd F2
foreach i (...\*)
   if ( -f $i ) then
      if ( -e F1\$i ) cp F1\$i Fbackup\$i
      cp $i F1\$i
   end
end

符號...是一個不定目錄通配符匹配零個或多個目錄級別,無論需要什麼才能使模式的其餘部分匹配。 ...\*符合目錄樹中的每個檔案或目錄F2。這-e操作員測試是否存在以及-f操作員測試文件。

此程式碼片段假設不存在相關的隱藏檔案或目錄。它還假設 中的每個目錄F2(即使不是每個檔案)都已存在於F1和中Fbackup

如果需要考慮隱藏檔案和遺失目錄,解決方案是設置 nonohidden = 1mkdir任何遺失的目錄:

cd F2
@ nonohidden = 1
foreach i (...\*)
   if ( -f $i ) then
      if ( -e F1\$i ) then
         if ( ! -e Fbackup\$i:h ) mkdir -r Fbackup\$i:h
         cp F1\$i Fbackup\$i
      end
      if ( ! -e F1\$i:h ) mkdir -r F1\$i:h
      cp $i F1\$i
   end
end

bash解決方案

如果你更喜歡西格文 bash,您需要使用find代替通配符...來對F2目錄進行樹形遍歷。該解決方案可能如下所示。 (我不是bash專家,所以也許可以改進這一點。)

首先,建立一個腳本,命名為backupscript.sh

#!/usr/bin/bash
if [ -f "$@" ]; then
   if [ -e F1/"$@" ]; then
      cp F1/"$@" Fbackup/"$@"
   fi
   head=$(dirname "$@")
   if [ ! -e F1/"$head" ]; then
      mkdir -p F1/"$head"
   fi
   cp "$@" F1/"$@"
end

然後運行如下:

cd F2
find . -type f  | xargs -I "{}" bash -c "backupscript.sh {}"

相關內容