我剛剛將一個 49GB 的目錄「mv」到一個錯誤的檔案路徑,是否可以恢復檔案的原始狀態?

我剛剛將一個 49GB 的目錄「mv」到一個錯誤的檔案路徑,是否可以恢復檔案的原始狀態?

我有(嗯,我) 目錄:

/media/admin/my_data

它大約有 49GB 大小,裡面有數萬個檔案。該目錄是活動 LUKS 分割區的掛載點。

我想將目錄重新命名為:

/media/admin/my_data_on_60GB_partition

我當時沒有意識到,但我從主目錄發出了命令,所以我最終做了:

~% sudo mv /media/admin/my_data my_data_on_60GB_partition

然後mv程式開始將/media/admin/my_data其內容移至新目錄~/my_data_on_60GB_partition

我使用Ctrl+C來取消命令,所以現在我有一大堆文件分成不同的目錄:

~/my_data_on_60GB_partition    <---  about 2GB worth files in here

/media/admin/my_data           <---- about 47GB of orig files in here    

新目錄~/my_data_on_60GB_partition及其一些子目錄歸 root 所有。
我假設mv程式必須先以 root 身分複製文件,然後在傳輸後將chown它們返回到我的使用者帳戶。

我有一個有點舊的目錄/分割區備份。
我的問題是,是否可以可靠地恢復被移動的一堆檔案?

也就是說,我可以運行:

sudo mv ~/my_data_on_60GB_partition/*  /media/admin/my_data

或者我應該放棄嘗試恢復,因為文件可能已損壞且部分完整等?

  • 作業系統 - Ubuntu 16.04
mv --version  
mv (GNU coreutils) 8.25

答案1

在文件系統之間移動文件時,mv在完成複製之前不會刪除文件,並且它會按順序處理文件(我最初說它會依次複製然後刪除每個文件,但這並不能保證 - 至少 GNUmv複製然後刪除每個文件)命令列參數依次,並且POSIX 指定了此行為)。因此,目標目錄中最多應有一個不完整的文件,而原始文件仍將位於來源目錄中。

要將內容移回,請添加標誌-i,這樣mv就不會覆蓋任何內容:

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

(假設您沒有任何隱藏文件可供恢復~/my_data_on_60GB_partition/),或者更好(鑑於您發現,您可能有許多文件等待刪除),添加該-n標誌,這樣mv就不會覆蓋任何內容,但不會問你:

sudo mv -n ~/my_data_on_60GB_partition/* /media/admin/my_data/

您也可以新增-v標誌來查看正在執行的操作。

對於任何符合 POSIX 標準的mv,原始目錄結構應該仍然完好無損,因此您也可以檢查這一點 - 並簡單地刪除/media/admin/my_data...(但在一般情況下,我認為該mv -n變體是安全的方法- 它處理所有形式的mv,包括例如 mv /media/admin/my_data/* my_data_on_60GB_partition/.)

您可能需要恢復一些權限;你可以這麼做全體使用chown和,或使用和chmod從備份中恢復它們(感謝getfaclsetfacl佐藤桂為了提醒)。

答案2

在得到 Stephen Kitt 的回答並討論此命令作為潛在的解決方案後:

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

我決定推遲運行它,直到我明白髮生了什麼,這個答案描述了我發現並最終做了什麼。

我使用 Gnumv將檔案複製到目標,然後僅當複製操作成功時,它才會刪除原始檔案。
但是我想確認是否mv一次執行一個文件這個序列,如果是這樣,原始資料夾內容將被乾淨地切成兩部分,一部分轉移到目的地,另一部分仍然留在來源處。並且可能會有一個檔案在複製過程中中斷,該檔案在兩個目錄之間是常見的 - 並且它可能格式錯誤。

為了發現兩個目錄之間常見的文件,我運行了:

~% sudo diff -r --report-identical-files my_data_on_60GB_partition/. /media/admin/mydata/. | grep identical | wc -l
14237

這個結果表明來源目錄和目標目錄中都有 14,237 個相同檔案的實例,我透過手動檢查檔案確認了這一點 - 是的,兩個目錄中都有許多相同的檔案。這表明只有在mv複製大量文件後,它才會執行來源文件的刪除。快速尋找infoonmv指令顯示

它[ mv]首先使用一些與複製所請求的目錄和檔案相同的程式碼cp -a,然後(假設複製成功)刪除原始檔案。如果複製失敗,則複製到目標分割區的部分將被刪除。

我沒有運行該命令,但我懷疑我是否嘗試運行

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

-i 覆蓋前提示可能會觸發超過 14,000 次。

然後查看新建立的目錄中總共有多少個檔案:

~% sudo find my_data_on_60GB_partition/ -type f -a -print | wc -l                                                                    
14238

因此,如果新目錄中總共有 14238 個常規文件,並且 14237 個文件在來源​​中具有相同的原始文件,則表示新目錄中只有一個文件在來源​​中沒有相應的相同文件。為了找出該檔案是什麼,我按照來源方向運行了 rsync:

~% sudo rsync -av --dry-run my_data_on_60GB_partition/ /media/admin/my_data
sending incremental file list
./
Education_learning_reference/
Education_learning_reference/Business_Education/
Education_learning_reference/Business_Education/Business_education_media_files/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/Jeff and David F interview/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/Jeff and David F interview/018 business plans-identifying main KPIs.flv

sent 494,548 bytes  received 1,881 bytes  330,952.67 bytes/sec
total size is 1,900,548,824  speedup is 3,828.44 (DRY RUN)

快速檢查確認這是格式錯誤的文件,該文件在來源​​和目標上都存在,目標文件=64MB,原始文件=100MB。該檔案及其目錄層次結構仍歸 root 所有,且尚未恢復原始權限。

總結來說:

  • 所有從未到達的文件 mv仍然回到原來的位置(顯然)
  • 所有完全複製的檔案mv在來源目錄中仍然有其原始副本
  • 僅部分複製的檔案仍將原始檔案保留在來源目錄中

換句話說,所有原始檔案仍然完好無損,這種情況下的解決方案就是簡單地刪除新目錄!

答案3

我只是想我要評論一下,有些人可能會忍不住將“xargs”混入其中以並行運行。這讓我很興奮,我真的很喜歡上面的 rsync 解決方案。

至於有關移動和複製的檔案系統內容以及原始檔案何時被刪除,VFS 和底層檔案系統會在執行刪除步驟之前進行協調以確保每個檔案的原子性。因此,即使在目標檔案完全寫入之前被中斷,VFS 中的所有鎖定都是非常嚴格的,並且即使在並行情況下也能防止隨機資料交錯等問題。 (我研究過 Linux VFS 和 NFS4 的東西)

在混合中加入「xargs」可能會使雙重健全性檢查步驟變得令人頭痛,因為多個檔案正在傳輸中。我希望我有更多的系統級腳本。對我來說很好的提醒!

喜歡這個問題,對蜘蛛網有好處,讓我再次喜歡 rsync。乾杯!

相關內容