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


668

Estou tentando usar o cpcomando e forçar uma substituição.

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

Respostas:


1113

Você pode fazer isso yes | cp -rf xxx yyy, mas meu sentimento de intestino diz que, se você faz isso como root - seu .bashrcou .profiletem um apelido cppara - cp -i, a maioria dos sistemas modernos (principalmente derivados de RH) fazem isso nos perfis de raiz.

Você pode verificar aliases existentes executando aliasno prompt de comando ou which cpverificar apenas aliases cp.

Se você tiver um alias definido, a execução unalias cpabolirá a da sessão atual; caso contrário, você poderá removê-lo do seu perfil de shell.

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


3
Além disso, tenha cuidado - mesmo que o alias não esteja diretamente escrito em .bashrc, se qualquer outra coisa que esse arquivo chamar acabar chamando algo que manipula o alias do cp, você terá esse comportamento.
Jon

4
Por "sistemas modernos" ele quer dizer RHEL / centos / fedora e talvez algo mais, o Debian / Ubuntu não alias cp. Eu prefiro o RHEL no servidor e usei o Fedora por quase uma década, mas o suporte da comunidade do Ubuntu e a mudança de volta para o Gnome me atraíram depois que a Nvidia matou minha instalação do Fedora. Eu sou ¯\_(ツ)_/¯sobre isso.
Ray Foss

2
@RayFoss Adicionado um (primarily RH-derivatives)comentário :)
favoretti 21/01

depois de fazer unalias cpe copiar o que você precisar copiar, você pode definir o alias de volta ao padrão fazendo alias cp='cp -i'. Depois disso, execute alias cppara verificar se está de volta ao alias padrão.
jaxarroyo

287

Provavelmente, isso é causado por cpjá estar associado a algo parecido cp -i. Ligar cpdiretamente deve funcionar:

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

Outra maneira de contornar isso é usar o yescomando:

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

6
sim, eu fiz unalias cp -i, agora está funcionando .. Obrigado pela sua valiosa resposta.
thiyagu114

5
Eu amo que o unix fornece o yescomando. Hilário. E um dia eu posso usá-lo.
Matthew Leingang

3
sim foi alias, prendedor agradável :) Você pode usar \ cp para chamar a cp original, mais fácil do que lembrar o caminho / bin / cp
Hugo Zaragoza

Sim, essa é outra maneira de ignorar o alias. Uma espécie de puro truque!
PGL

1
Desta forma é mais seguro.
plusmancn

115

Como algumas das outras respostas afirmaram, você provavelmente usa um algum lugar apelido que mapeia cppara cp -iou 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 os apelidos que você chamou cp.


2
@zhouji A folga desativa o alias, como indicado na minha resposta. Então, em vez de invocar o alias cp, \cpinvocará o comando cp. Parece ser o equivalente à execução command cp.
Chris

66

Você provavelmente tem um alias em algum lugar, mapeando cppara cp -i; porque com as configurações padrão, cpnão solicitará a substituição. Verifique seu .bashrc, seu .profileetc.

Consulte cp manpage : Somente quando o -iparâmetro for especificado, cpna verdade, será solicitado antes da substituição.

Você pode verificar isso através do aliascomando:

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

Para definir o alias, use:

$ unalias cp

sim, eu fiz unalias cp -i, agora está funcionando .. Obrigado pela sua valiosa resposta.
thiyagu114

1
é apenas "unalias cp"
Krv Perera 15/11

49

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

Você pode anexar um \antes do cpcomando para usá-lo sem alias.

\cp -fR source target

1
Como você disse, outros já afirmaram isso. Por que isso recebeu 45 votos positivos?
phil294

@ phil294 Acho que essa é a maneira mais fácil, sem modificar o alias ou remover o alias do cp, que pode ser útil para outros usos. `` É muito útil aqui.
Arnold Roa

18

Por padrão, cptem aliase para cp -i. Você pode verificá-lo, digitar aliase 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 esse problema, basta usar o /bin/cp /from /tocomandocp /from /to


9

você pode usar este comando também:

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

ele atualizaria seu arquivo existente com o mais novo.


8

cp geralmente é um alias como este

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

se tiver certeza de que deseja fazer a substituição, use o seguinte:

/bin/cp <arguments here> src dest


7

Então, eu me deparo muito com isso porque mantenho o alias do cp cp -ive achei um truque interessante. Acontece que, enquanto -ie -ntanto cancelar directivas sobrescrever anteriores, -fnão. No entanto, se você usá- -nflo, adiciona a capacidade de limpar o arquivo -i. Assim:

cp -f /foo/* /bar  <-- Prompt
cp -nf /foo/* /bar <-- No Prompt

Muito legal né? / necropost



5

Outra maneira de chamar o comando sem o alias é usar o commandbuilt-in no bash.

command cp -rf /zzz/zzz/*


4

-n é "não sobrescrever", mas a pergunta dele é totalmente oposta à que você respondeu.

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

destino do arquivo de origem / bin / cp


2

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

Apenas use:

alias cp = cp

e escreva seus comandos de acompanhamento.


0

Simplesmente usei unalias para remover o alias "cp -i", depois faça a cópia e, em seguida, defina 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. Também verifico que o alias já está atrasado com um simples

alias |grep cp

-2

Não é cp -i. Se você não deseja ser solicitado para confirmação, é cp -n; por exemplo:

cp -n src dest

Ou no caso de diretórios / pastas é:

cp -nr src_dir dest_dir

2
Outros estavam afirmando que o cp voltado para o usuário era vinculado cp -ipelo sistema, o que significa que eles estavam tentando superar o padrão e forçar uma substituição. Parece que você pode ter confundido que por ser a sintaxe sugerida, mas -nvai evitar uma substituição.
Carro abandonado
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.