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/d
cd a/b x/y/z
답변2
나는 실용적이기를 좋아하고 zsh 완성을 작성하는 것은 현재의 기술 범위를 넘어서기 때문에 select
zsh(및 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를 입력하여 디렉토리로 이동할 수 있는 스타일 메뉴가 있습니다.