O asterisco é tratado de maneira diferente no comando cp em 12.04 e 16.04 [closed]

2

Para fazer backups de arquivos de configuração no 12.04, usei a seguinte sintaxe:

cp -p fstab *.bak

Isso funcionou sem problemas, o arquivo fstab.bak foi criado na mesma pasta com os mesmos atributos do arquivo original.
Em 16.04 este comando funciona de forma absolutamente diferente. Ele cria *.bak file, ou seja, a cópia do arquivo original com o nome asterisk-dot-bak. Se algum arquivo com a extensão bak já existir nessa pasta, ele não fará nada e emitirá um aviso:

  

cp: target 'inputrc.bak' não é um diretório

Eu assumo que globbing funciona de forma diferente em 12.04 e 16.04. Eu comparei shopt de saída em ambos os sistemas - a diferença é pequena e as opções globbing são as mesmas. OU cp em 16.04 trata asterisco diferentemente do que era em 12.04.
Existe uma maneira de preservar o antigo comportamento do comando cp em 16.04?

    
por whtyger 06.03.2017 / 10:02

1 resposta

25

Não é um caso de globbing dar errado, mas quais arquivos estão presentes no diretório:

  1. Nenhum arquivo .bak está presente. Em seguida, *.bak , a menos que nullglob seja definido, seja expandido para *.bak . Portanto, o comando executado é literalmente cp -p fstab *.bak .
  2. Apenas fstab.bak está presente. Em seguida, *.bak será expandido para apenas fstab.bak e cp -p fstab fstab.bak será executado. Isso é o que você parece esperar, independentemente dos arquivos presentes.
  3. Vários arquivos *.bak estão presentes (por exemplo, fstab.bak e inputrc.bak ). Então, cp -p fstab fstab.bak inputrc.bak é executado. Nesse caso, cp espera que o último argumento seja um diretório ou que um diretório de destino seja especificado usando -t . Se não, vai reclamar.

Não faça coisas idiotas como cp file *.bak , cujos resultados podem variar com base nos arquivos presentes. Você realmente quer fazer o backup de fstab para iputrc.bak se fstab.bak não estiver presente e inputrc.bak for? Se você está com preguiça de digitar o nome do arquivo, use a expansão de chaves:

cp -p file{,.bak}

Melhor ainda, use o controle de versão e etckeeper em vez do frágil .bak -copying.

    
por muru 06.03.2017 / 10:37