繼續 mv 的最佳實踐
我使用終端將文件從一個驅動器複製到另一個驅動器。
sudo mv -vi /location/to/drive1/ /location/to/drive2/
然而,在創建目錄後,這突然停止了,幾個小時後,沒有錯誤。
我自己的解決方案通常是散列和比較的混合,這主要是一個耗時的混亂,因為我現在必須在不知道哪些文件失去的情況下從中間副本中恢復(寫為 zsh 的非常長的單行 - 請注意此腳本在 bash 中不起作用):
source_directory="/path/to/source_directory/"; target_directory="/path/to/target_directory/"; while read hash_and_file; do { echo "${hash_and_file}" | read hash file; echo "${file}" | sed "s/^/${source_directory}/g" | read copy_from; echo "${copy_from}" | sed "s/${source_directory}/${target_directory}/g" | read copy_to; mv -v "${copy_from}" "${copy_to}" | tee -a log; rm -v "${copy_from}" | tee -a log; }; done <<<$( comm -23 <( find ${source_directory} -type f -exec sha256sum "{}" \; | sed "s: ${source_directory}: :g" | sort; ) <( find ${target_directory} -type f -exec sha256sum "{}" \; | sed "s: ${target_directory}: :g" | sort; ) )
如果名稱 target directory 或 source_directory 是路徑的一部分,這很容易出錯,如果文件由於被標記為重複而未被移動,則刪除文件。最後它也沒有源目錄。
是否有最佳實踐如何從中斷的 mv 中恢復?
忘記嘗試重新發明 rsync,並使用 rsync。
sudo rsync -av /location/to/drive1/ /location/to/drive2/
確保在源文件上使用尾部斜杠,否則它會復製到
/location/to/drive2/drive1
.仔細檢查命令是否成功,然後執行
rm -rf /location/to/drive1/
.上面的命令將覆蓋任何預先存在的文件
drive2
。如果您想提示使用者跳過 中已存在的文件drive2
,如mv -i
,則更複雜,因為您現在需要區分已複製的文件和尚未複製的文件。您可以將--ignore-existing
選項傳遞給 rsync 以跳過目標上已存在的文件,無論其內容如何。請注意,如果原始mv
文件在創建文件的過程中被中斷,則該文件將保持半複製狀態(而裸文件rsync -a
將正確完成複制)。如果您想重現 的確切行為
mv -i
,包括提示,可以這樣做,但要復雜得多。請注意,您的巨型班輪非常脆弱。如果文件名包含反斜杠或換行符,它們可能無法正確複製,甚至可能會欺騙您的腳本刪除任意文件。因此,除非您確定可以信任文件名不包含反斜杠或換行符,否則請勿使用問題中的程式碼。
為了將來參考,我建議永遠不要使用
mv
大的交叉驅動器移動,正是因為如果它被打斷,很難控制會發生什麼。使用 rsync 進行複制,然後刪除原件。