例如我有資料夾:
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
- F21
、F12
和F22
是相等的。
資料夾中的檔案比F21
,中的檔案F22
少F11
。F12
我需要遞歸F2
複製F1
,但將被替換的檔案 - 應保存在備份資料夾中:
Fbackup\F11\those files..
Fbackup\F12\those files..
這是為了能夠對該副本進行「撤消」操作所必需的。例如,我已經遞歸F2
複製F1
,然後將 Fbackup 複製到F1
並且我有原始的F1
.
答案1
如果您願意使用 Unix shell,這裡有一些使用bash
我自己的 C shell 的替代方案。
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 = 1
和mkdir
任何遺失的目錄:
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 {}"