我正在嘗試使用以下方法在 btrfs 檔案系統崩潰後恢復檔案:
btrfs restore --path-regex 'regex' -sv -D /dev/sdXX /mnt/destination
例如,要檢索/snapshots/@_2018-06-01T23:29:33-04:00.preupgrade/
我嘗試以下的所有文件http://www.kossboss.com/?p=2277並得到了(以及許多其他嘗試):
^/(|/snapshots(|/\@\_2018\-06\-01T23\:29\:33\-04\:00\.preupgrade(|/.*)))$
這無法選擇任何文件。我已經嘗試了5個小時的事情。我很茫然。
我究竟做錯了什麼?我怎樣才能讓它發揮作用?
出於多種原因,它需要進行選擇性。男子氣概是因為它在中間失敗了,我需要編寫選擇性嘗試的腳本來檢索失敗以外的可行文件。
答案1
btrfs restore
從根開始掃描檔案系統並將每個條目與正規表示式進行比較。如果路徑與正規表示式相符且它是目錄,它將掃描該目錄。如果它是一個文件並且匹配,它將恢復它。
這意味著您嘗試恢復的檔案/目錄的每個父目錄都需要透過正規表示式進行匹配,以確保復原程式最終能夠到達它。
手冊頁中的範例^/(|home(|/username(|/Desktop(|/.*))))$
正規表示式的真正含義是,“/
後跟什麼都沒有或home
後跟什麼也沒有或後跟什麼/username
也沒有或/Desktop
後跟什麼都沒有或/.*
”,相當於“/或/home或/home/username或/ home/username/桌面或/home/使用者名稱/Desktop/.*」。
不尋常的(|/foo)
結構不匹配任何 or /foo
,嵌套捕獲組只是為了能夠嵌套 or 語句。
為了方便閱讀,我建議將正規表示式編寫為^(/|/home|/home/username|/home/username/Desktop/|/home/username/Desktop/.*)$
,我認為這對於它的作用更加清晰。
答案2
好的。我可能已經明白了。無論如何,讓它發揮作用。冒號和破折號是不可逃避的,它們不是正常的正規表示式。對於冒號和破折號等,我可以簡單地匹配“。”
為了清楚起見,按照手冊頁中的說明進行操作,我得到了以下資訊:
# restore specific path:
# "@_2018-08-17_08.18.30.preupgrade"
btrfs restore --path-regex \
'^/(|snapshots(|/@\_2018.*08.17.*preupgrade(|/.*)))$' \
-s -o /dev/sda5 /media/outputdir/
這仍然留下了一個問題:正規表示式格式是怎麼回事?
從手冊頁: --path-regex 僅恢復與強制格式的正規表示式 (regex(7)) 相符的檔名
^/(|home(|/username(|/Desktop(|/.*))))$
該格式不太舒服,並且會恢復整個路徑中目錄中的所有文件,因此這對於恢復深層層次結構中的單一文件沒有用。