"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/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(|/.*))))$

형식이 매우 편안하지 않으며 전체 경로의 디렉터리에 있는 모든 파일을 복원하므로 깊은 계층 구조의 단일 파일을 복원하는 데 유용하지 않습니다.

관련 정보