Melhore o 'mv' para requerer um alvo de especificação explícito?

0

Ocorri alguns erros devido a não especificar o destino corretamente ao usar mv . Para mais detalhes, consulte:

Podemos tornar mv mais seguro contra esses erros humanos?

    
por Tim 24.03.2015 / 17:51

3 respostas

1

A maneira mais comum de adicionar proteção extra contra erros como esse é colocar os três aliases a seguir em seu shells rc-file (~ / .bashrc no caso bash):

alias cp="cp -i"
alias mv="mv -i"
alias rm="rm -i"

A opção -i significa interativa e será exibida antes de sobrescrever ou excluir arquivos.

rm também tem outra adaptação disso:

-I                    prompt once before removing more than three files, or
                      when removing recursively.  Less intrusive than -i,
                      while still giving protection against most mistakes
    
por 24.03.2015 / 18:00
2

A sintaxe de mv foi gravada nas mentes dos administradores e usuários por muito tempo, para não mencionar quase incontavelmente muitos scripts que chamam mv, então mudar a interface do usuário vai quebrar muito. Seria melhor escrever um wrapper (ou uma ferramenta inteiramente nova) que espera um alvo explícito.

    
por 24.03.2015 / 20:43
1

Um comando não tem como saber quais curingas foram expandidos para compor seus argumentos.

Em zsh, você pode adicionar o modificador noglob na frente de um comando para impedir a expansão de curingas. Isso permite que você defina um wrapper que rejeite a chamada, se o último argumento contiver caracteres curinga.

mv_check_last_argument () {
  local last
  setopt local_options null_glob
  last=(${~${(P)#}})
  if [[ $#last -eq 1 && $last[1] = ${(P)#} ]]; then
    command mv $~@[@]
  else
    echo 1>&2 "Not running mv because '${(P)#}' is a wildcard pattern"
    return 125
  fi
}
alias mv='noglob mv_check_last_argument'

(Aviso: código não testado)

Isso, obviamente, priva a capacidade de usar curingas quando você pretende corresponder a um único diretório de destino, mas isso geralmente não é muito útil, porque você pode usar a conclusão. Quando você quiser usar curingas, use \mv … com uma barra invertida para suprimir o alias.

Erros com mv são fáceis de desfazer, a menos que você tenha sobrescrito um arquivo de destino existente. Para evitar sobrescrever o arquivo de destino, há uma maneira fácil: execute mv -i em vez de mv . Dessa forma, mv apenas faz o trabalho de mover um arquivo e avisa se ele teria que fazer o trabalho adicional de remover um arquivo. Novamente, use \mv … para pular o alias e sobrescrever incondicionalmente o destino, se já existir.

alias cp='cp -i' mv='mv -i'
    
por 25.03.2015 / 02:25

Tags