A melhor maneira de procurar diferentes versões de um backup de um diretório

1

Estou usando um script de backup rsync (veja aqui: link ) que cria diretórios como

back-2015-07-02T21_18_01

Agora, suponha que eu esteja na linha de comando ( zsh ) em /path/to/my/backup/back-2015-07-02T21_18_01/home/myuser/myfiles/somedir/subdir/ e quero mudar para /path/to/my/backup/back-2016-04-02T21_17_01/home/myuser/myfiles/somedir/subdir/ .

Qual é a maneira mais rápida / melhor de fazer isso em zsh ? Eu costumo usar a conclusão do menu zsh, por isso seria ótimo se eu pudesse apenas escolher via tabulação menu conclusão outra data, mas manter o subdiretório atual (apenas a partir da outra data de backup).

    
por student 06.07.2016 / 21:00

2 respostas

1

Eu gosto de ser pragmático, e como escrever uma conclusão zsh está fora das minhas habilidades atuais, eu acabei de escrever uma função de propósito especial usando o sistema de menu select de zsh (e 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
}

Isso divide o diretório atual em três partes em torno do diretório com um padrão de data e, em seguida, o substitui por um glob * . A lista resultante é apresentada por zsh com um menu de estilo 1) ... 2) ... , onde você acabou de digitar 1 ou 2 para acessar esse diretório.

    
por 07.07.2016 / 11:20
3

Uma forma de trocar um componente de diretório por outro em zsh é a versão de dois argumentos de cd :

cd old new

Isso substitui new para a primeira substring correspondente a old e tenta alterar o diretório para o caminho resultante. Por exemplo:

% 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/

A pesquisa e substituição são feitas inteiramente em um nível de string e a substituição é sempre feita somente na primeira correspondência. Portanto, se você estiver em /foo/foo/foo/foo , executar cd foo bar sempre tentará alterar o diretório para /bar/foo/foo/foo , se ele realmente existe ou não. Ele não irá procurar uma alternativa como /foo/foo/bar/foo , mesmo que exista.

A conclusão do segundo argumento é fornecida por compinit , mas você precisa digitar o primeiro argumento (pelo menos com as configurações de conclusão padrão). Se compinit - por algum motivo - não estiver ativado, você poderá alterar isso executando autoload -U compinit; compinit (e adicionando-o ao seu ~/.zshrc ).

Nota : cd suporta / caracteres na old e nova sequência, o que significa que pode mudar de /a/b/c/d para /x/y/z/c/d executando cd a/b x/y/z . Mas parece que a conclusão não funciona nesse caso, então você tem que digitar o segundo argumento sozinho também.

    
por 06.07.2016 / 22:34

Tags