Data-Recovery

繼續 mv 的最佳實踐

  • December 1, 2018

我使用終端將文件從一個驅動器複製到另一個驅動器。

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 進行複制,然後刪除原件。

引用自:https://unix.stackexchange.com/questions/485321