desenv-web-rp.com

Como forçar o cp a sobrescrever sem confirmação

Estou tentando usar o comando cp e forçar uma sobrescrita.

Eu tentei cp -rf /foo/* /bar, mas ainda sou solicitado a confirmar cada substituição.

545
thiyagu114

Você pode fazer yes | cp -rf xxx yyy, mas meu gutfeeling diz que se você fizer isso como root - seu .bashrc ou .profile tem um alias de cp para cp -i, a maioria dos sistemas modernos (principalmente RH-derivatives) fazem isso com perfis de raiz.

Você pode verificar aliases existentes executando alias no prompt de comando ou which cp para verificar aliases somente para cp.

Se você tiver um alias definido, a execução do unalias cp irá abolir isso para a sessão atual, caso contrário, você poderá simplesmente removê-lo do seu perfil do Shell.

Você pode ignorar temporariamente um alias e usar a versão sem alias de um comando prefixando-a com \, por exemplo, \cp whatever

951
favoretti

Isso provavelmente é causado por cp já estar com alias para algo como cp -i. Chamar cp diretamente deve funcionar:

/bin/cp -rf /zzz/zzz/* /xxx/xxx

Outra maneira de contornar isso é usar o comando yes:

yes | cp -rf /zzz/zzz/* /xxx/xxx
242
pgl

Como algumas das outras respostas afirmaram, você provavelmente usa um alias em algum lugar que mapeie cp para cp -i ou algo similar. Você pode executar um comando sem nenhum alias, precedendo-o com uma barra invertida. No seu caso, tente

\cp -r /zzz/zzz/* /xxx/xxx

A barra invertida desabilitará temporariamente todos os aliases que você chamou de cp.

101
Chris

Você provavelmente tem um alias em algum lugar, mapeando cp para cp -i; porque com as configurações padrão, cp não pedirá para sobrescrever. Verifique seu .bashrc, seu .profile etc.

Veja cp manpage : Somente quando o parâmetro -i for especificado, cp será avisado antes de sobrescrever.

Você pode verificar isso através do comando alias:

$ alias
alias cp='cp -i'
alias diff='diff -u'
....

Para indefinir o alias, use:

$ unalias cp
52
codeling

Como outras respostas afirmaram, isso pode acontecer se cp for um alias de cp -i.

Você pode acrescentar \ antes do comando cp para usá-lo sem alias.

\cp -fR source target
41
Arnold Roa

Por padrão, cp tem aliase para cp -i. Você pode verificar isso, digite alias e você pode ver alguns como:

alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'

Para resolver este problema, use o comando /bin/cp /from /to em vez de cp /from /to

18
Avseiytsev Dmitriy

cp geralmente é alias como esta

alias cp='cp -i'   # i.e. ask questions of overwriting

se você tem certeza de que deseja fazer a sobregravação, use isto:

/bin/cp <arguments here> src dest
8
user5035029
cp -u ...
cp --update ...

também funciona.

6
softwarevamp

você pode usar este comando também:

cp -ru /zzz/zzz/* /xxx/xxx

ele atualizaria seu arquivo existente com o mais novo.

5
sigeje

Outra maneira de chamar o comando sem o alias é usar o command embutido no bash.

command cp -rf /zzz/zzz/*

4
Steve Buzonas
4
Daniel Luevano Alonso

Se você quiser manter o alias no nível global como está e apenas deseja alterar seu script.

Apenas use:

alias cp = cp

e depois escreva seus comandos de acompanhamento.

2
Ankit Bhatnagar

-n é "não substituir", mas sua pergunta é totalmente oposta ao que você respondeu.

Para evitar essa confirmação você pode simplesmente executar o comando cp com caminho absoluto, ele evitará o alias.

/bin/cp sourcefile destination

2
Rohit Rajput

Eu simplesmente usei unalias para remover o alias "cp -i", depois faço a cópia e depois defino o alias. :

unalias cp  
cp -f foo foo.copy  
alias cp="cp -i"  

Não é o código mais bonito, mas fácil de configurar e eficiente. Eu também verifiquei o alias já está de volta com um simples

alias |grep cp
0
Maat