如何產生正規表示式來恢復「btrfs 復原」的特定資料夾?

如何產生正規表示式來恢復「btrfs 復原」的特定資料夾?

我正在嘗試使用以下方法在 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(|/.*))))$

該格式不太舒服,並且會恢復整個路徑中目錄中的所有文件,因此這對於恢復深層層次結構中的單一文件沒有用。

相關內容