다양한 버전의 카탈로그 백업을 찾아보는 가장 좋은 방법

다양한 버전의 카탈로그 백업을 찾아보는 가장 좋은 방법

rsync 백업 스크립트를 사용하고 있습니다(여기 참조:https://codereview.stackexchange.com/questions/29429/push-backup-script) 다음과 같은 디렉토리가 생성됩니다.

back-2015-07-02T21_18_01

zsh이제 명령줄( ) 에 있고 /path/to/my/backup/back-2015-07-02T21_18_01/home/myuser/myfiles/somedir/subdir/로 전환하고 싶다고 가정해 보겠습니다 /path/to/my/backup/back-2016-04-02T21_17_01/home/myuser/myfiles/somedir/subdir/.

가장 빠른/가장 좋은 방법은 무엇입니까 zsh? 저는 주로 zsh 메뉴 완성 기능을 사용하기 때문에 메뉴 탭 완성 기능을 통해 다른 날짜를 선택할 수 있으면서도 현재 하위 디렉토리는 유지하면 좋을 것 같습니다(다른 백업 날짜에서만 가능).

답변1

한 디렉터리 구성 요소를 다른 디렉터리 구성 요소로 바꾸는 한 가지 방법 zsh은 두 가지 매개 변수 버전을 사용하는 것입니다 cd.

cd old new

이는 new첫 번째 하위 문자열 일치를 대체 old하고 디렉터리를 결과 경로로 변경하려고 시도합니다. 예를 들어:

% pwd
/path/to/my/backup/back-2015-07-02T21_18_01/home/myuser/myfiles/somedir/subdir/
% cd "5-07-02T21_18_01" "6-04-02T21_17_01"
/path/to/my/backup/back-2016-04-02T21_17_01/home/myuser/myfiles/somedir/subdir/
% pwd
/path/to/my/backup/back-2016-04-02T21_17_01/home/myuser/myfiles/somedir/subdir/

검색 및 바꾸기는 전적으로 문자열 수준에서 수행되며 교체는 항상 첫 번째 일치 항목에서만 수행됩니다. 따라서 에 있는 경우 /foo/foo/foo/foo런타임은 실제로 존재하는지 여부에 관계없이 cd foo bar항상 디렉터리를 으로 변경하려고 시도합니다 . 설령 존재한다고 해도 그런 대체물을 찾지는 않을 것이다./bar/foo/foo/foo/foo/foo/bar/foo

두 번째 인수에 대한 완성 기능은 에서 제공되지만 compinit첫 번째 인수는 최소한 기본 완성 설정을 사용하여 입력해야 합니다. compinit어떤 이유로 활성화되지 않은 경우 실행 autoload -U compinit; compinit하고 에 추가하여 ~/.zshrc변경할 수 있습니다.

노트: 문자열 의 cd새 문자를 지원합니다 . 즉, 를 실행하여 전환할 수 있습니다 . 하지만 이 경우에는 완성이 되지 않는 것 같으니 두 번째 인수도 직접 입력해야 합니다./old/a/b/c/d/x/y/z/c/dcd a/b x/y/z

답변2

나는 실용적이기를 좋아하고 zsh 완성을 작성하는 것은 현재의 기술 범위를 넘어서기 때문에 selectzsh(및 bash의) 메뉴 시스템을 사용하여 특수 목적 기능을 작성했습니다.

cdd(){
    typeset dir
    typeset -a dirs
    if [[ $PWD =~ ^(.*)(/back-[0-9-]+T[0-9_]+/)(.*)$ ]]
    then    for dir in "$match[1]"/*/"$match[3]"
            do      [ "$dir" != "$PWD"  -a  -d "$dir" ] && dirs+=("$dir")
            done
            select dir in "$dirs[@]"
            do      echo "$dir"
                    cd "$dir"
                    break
            done
    else    echo "no date in $PWD"
    fi
}

이는 현재 디렉토리를 날짜 패턴을 사용하여 디렉토리를 둘러싸는 세 부분으로 분할한 다음 globs로 대체합니다 *. 결과 목록은 zsh에서 제공되며, 1) ... 2) ...1 또는 2를 입력하여 디렉토리로 이동할 수 있는 스타일 메뉴가 있습니다.

관련 정보