Diretório de mudanças rápidas para uma estrutura de diretório similar?

4

No ambiente de teste, temos uma estrutura de diretório para arquivos de log que se parece com isso:

/var/Logs/int/app-id/region-code/log/file-name.log
/var/Logs/sat/app-id/region-code/log/file-name.log
/var/Logs/cat/app-id/region-code/log/file-name.log

Existem muitos ids de aplicativos por ambiente e vários códigos de região por app-id (dependendo do aplicativo).

Existe um único comando que me permitirá alterar o diretório de int para sat, mantendo todo o resto do caminho o mesmo? Algo como o seguinte:

$ pwd
/var/Logs/int/abc/01/log
$ cdswap int sat
$ pwd
/var/Logs/sat/abc/01/log
$ cdswap abc def
$ pwd
/var/Logs/sat/def/01/log

Seria um bônus se isso também funcionasse:

$ cdswap def/01 ghi/02
$ pwd
/var/Logs/sat/ghi/02/log

Se não houver tal comando, posso configurar um alias que efetivamente faria a mesma coisa? Como isso seria?

Obrigado pela sua ajuda!

    
por scope.creep 10.06.2015 / 23:52

3 respostas

5

Em zsh, cdswap é… cd . Quando dados dois argumentos, cd substitui o primeiro argumento pelo segundo argumento no diretório atual e muda para o diretório resultante.

Você pode emular isso no bash fazendo cd uma função.

cd () {
  local i=1
  while [[ "${!i}" = -* ]]; do ((++i)); done
  if ((i == $# - 1)); then
    local operands
    operands=("$@")
    operands[$i]=${PWD/${!i}/${!#}}
    if [[ "${operands[$i]}" == "$PWD" ]]; then
      echo >&2 "cd: string not in pwd: ${operands[$i]}"
      return 1
    fi
    set -- "${operands[@]:$(($#-1))}"
  fi
  builtin cd "$@"
}
    
por 11.06.2015 / 00:25
3

Se você estiver usando bash esta função do shell deve fazer o que você deseja. Remova o pwd; se você não quiser uma atualização visível do novo local do diretório.

cdswap() { cd "${PWD/$1/$2}"; pwd; }

Exemplos

$ cd /usr/local/src
$ pwd
/usr/local/src
$ cdswap src bin
/usr/local/bin
$ pwd
/usr/local/bin
$ cdswap local/bin src
/usr/src
    
por 11.06.2015 / 00:29
-1

Tente usar o seguinte:

cd $(echo $PWD | sed 's/abc/def/')

Torne esses comandos um pseudônimo e você está fora das raças.

Você também pode criar uma função para poder trocar os arquivos para trocar.

function cdswap() {
  cd $(echo $PWD | sed 's/$1/$2/')
}

Em seguida, coloque essa função no seu .bash_profile

    
por 11.06.2015 / 00:24