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/Desktop または /home/username/Desktop/.*」に相当します。
異常な(|/foo)
構造は何も一致しないか、/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(|/.*))))$
この形式はあまり使いやすくなく、パス全体のディレクトリ内のすべてのファイルを復元するため、深い階層内の単一ファイルを復元するのには役立ちません。