Como evitar cp -r ~ / some / folder /. copiando todos os arquivos para o nível superior da pasta atual?

3

( Atualização: isso acontece no Mac OS X - estou usando o Mountain Lion.) Às vezes acontece de eu usar a tecla guia para completar o caminho, então meu comando pode ser:

cp -r ~/some/folder/ .

mas acontece que a linha acima tem um comportamento diferente de

cp -r ~/some/folder .

a segunda linha copiará a pasta para o diretório atual, como folder , mas a primeira linha copiará todos os 7 arquivos, 6 subpastas para o diretório atual, contaminando o diretório atual. Desde que eu não faço qualquer controle de origem usando git ou svn nesse diretório atual particular, ele realmente tem que ser limpo manualmente, e é uma dor muito.

Existe uma maneira de evitar que isso aconteça? Tal como fazendo uma função, alias ou configuração de Bash? Eu sei que consigo me lembrar disso, mas dois meses mais tarde, eu posso acidentalmente fazer a mesma coisa novamente, então é melhor se proteger contra esse comportamento. (Eu prefiro precisar usar cp -r ~/some/folder/* . e cp -r ~/some/folder/.* . se é isso que eu realmente quero.)

    
por 太極者無極而生 19.11.2012 / 15:19

2 respostas

2

Para fazer isso corretamente, seria necessário analisar novamente todas as opções do cp, e isso não é uma boa ideia. Mas aqui está algo que deve se aproximar:

# run cp command as-given, unless any argument ends in a slash
safecp() {
  for arg; do
    case $arg in */)
      echo "safecp: trailing slash in cp $*" >&2
      return 1
      ;;
    esac
  done
  cp "$@"
}

Como alternativa, tente colocar

set mark-directories off

no seu ~/.inputrc para fazer o bash não adicionar automaticamente uma barra ao completar os diretórios.

    
por 19.11.2012 / 17:09
0

Você poderia certamente escrever uma função bash curta (com uma versão recente do bash, que pode fazer expressões regulares é extremamente simples), que pegaria esse tipo de erro:

function cpr () {
    local src=...
    if [[ "$src" =~ /$ ]]; then
        # handle error
    else
        # proceed with copying
    fi 
}

a parte complicada é determinar qual dest deve ser (você certamente quer pular o diretório de destino), se você quer cobrir todas as combinações de opções de cp (pelo menos o GNU coreutils ' cp tem 3 diferentes variações de sintaxe).

Usar uma função especializada para corrigi-la no local pode ser melhor:

function cpr () {
    cp -R ${1%%/} ${2}
}
    
por 19.11.2012 / 17:28

Tags