Cómo forzar a cp a sobrescribir sin confirmación

668

Estoy tratando de usar el cpcomando y forzar una sobrescritura.

Lo he intentado cp -rf /foo/* /bar, pero todavía se me pide que confirme cada sobrescritura.

thiyagu114
fuente

Respuestas:

1113

Puede hacerlo yes | cp -rf xxx yyy, pero mi gutfeeling dice que si lo hace como root - su .bashrco .profiletiene un alias de cpa cp -i, los sistemas más modernos (principalmente RH-derivados) que hacen a los perfiles de raíz.

Puede verificar los alias existentes ejecutando aliasen el símbolo del sistema, o which cppara verificar solo los alias cp.

Si tiene un alias definido, la ejecución unalias cpeliminará eso para la sesión actual, de lo contrario, puede eliminarlo de su perfil de shell.

Puede omitir temporalmente un alias y usar la versión sin alias de un comando con el prefijo \, p. Ej.\cp whatever

favoretti
fuente
3
Además, tenga cuidado, incluso si el alias no está escrito directamente en .bashrc, si algo más a lo que llama este archivo termina llamando a otra cosa que manipula el alias para cp, se encontrará con este comportamiento.
Jon
44
Por "sistemas modernos" se refiere a RHEL / centos / fedora y quizás algo más, Debian / Ubuntu no alias cp. Prefiero RHEL en el servidor y usé Fedora durante casi una década, pero el apoyo de la comunidad de Ubuntu y el cambio a Gnome me convencieron después de que Nvidia cerró mi instalación de Fedora. Estoy al ¯\_(ツ)_/¯respecto.
Ray Foss
2
@RayFoss Agregó un (primarily RH-derivatives)comentario :)
favoretti
después de hacer unalias cpy copiar lo que necesite copiar, puede volver a establecer el alias a su valor predeterminado haciendo alias cp='cp -i'. Después de lo cual, ejecute alias cppara que pueda verificar que ha vuelto al alias predeterminado.
jaxarroyo
287

Esto probablemente es causado por cpestar alias a algo así cp -i. Llamar cpdirectamente debería funcionar:

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

Otra forma de evitar esto es usar el yescomando:

yes | cp -rf /zzz/zzz/* /xxx/xxx
pgl
fuente
66
Sí, hice unalias cp -i, ahora está funcionando. Gracias por su valiosa respuesta.
thiyagu114
55
Me encanta que Unix proporcione el yescomando. Divertidísimo. Y algún día puedo usarlo.
Matthew Leingang
3
sí, tenía un alias, buena captura :) Puedes usar \ cp para llamar al cp original, más fácil que recordar la ruta / bin / cp
Hugo Zaragoza
Sí, esa es otra forma de evitar el alias. ¡Una especie de hack limpio!
pgl
1
De esta manera es más seguro.
plusmancn
115

Como algunas de las otras respuestas han dicho, es probable que utilice un alias en algún lugar que se asigna cpa cp -io algo similar. Puede ejecutar un comando sin ningún alias precediéndolo con una barra diagonal inversa. En tu caso, intenta

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

La barra invertida desactivará temporalmente cualquier alias que haya llamado cp.

Chris
fuente
2
@zhouji La reacción desactiva el alias, como se indica en mi respuesta. Entonces, en lugar de invocar el alias cp, \cpinvocará el comando cp. Esto parece ser el equivalente de correr command cp.
Chris
66

Probablemente tengas un alias en alguna parte, asignando cpa cp -i; porque con la configuración predeterminada, cpno pedirá sobrescribir. Comprueba tu .bashrc, tu .profileetc.

Consulte la página de manual de cp : solo cuando -ise especifique el parámetro, se cpsolicitará antes de sobrescribir.

Puede verificar esto mediante el aliascomando:

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

Para definir el alias, use:

$ unalias cp
codeling
fuente
Sí, hice unalias cp -i, ahora está funcionando. Gracias por su valiosa respuesta.
thiyagu114
1
es solo "unalias cp"
Krv Perera
49

Como han dicho otras respuestas, esto podría suceder si cpes un alias de cp -i.

Puede agregar un \antes del cpcomando para usarlo sin alias.

\cp -fR source target
Arnold Roa
fuente
1
Como dijiste, otros ya lo han dicho. ¿Por qué obtuvo 45 votos a favor?
phil294
@ phil294 Creo que esta es la forma más fácil sin modificar el alias o eliminar el alias cp que puede ser útil para otros usos. `` Es muy útil aquí.
Arnold Roa
18

Por defecto cptiene aliase a cp -i. Puede verificarlo, escribir aliasy puede ver algunos 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, simplemente use el /bin/cp /from /tocomandocp /from /to

Avseiytsev Dmitriy
fuente
9

puedes usar este comando también:

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

aunque actualizaría su archivo existente con el más nuevo.

sigeje
fuente
8

cp generalmente tiene un alias como este

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

si está seguro de que desea sobrescribir, use esto:

/bin/cp <arguments here> src dest
usuario5035029
fuente
7

Así que me encuentro mucho con esto porque sigo alias cp cp -iv, y encontré un buen truco. Resulta que mientras -iy -ntanto cancelar directivas de sobreescritura anteriores, -fno lo hace. Sin embargo, si lo usa -nfagrega la capacidad de borrar el -i. Entonces:

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

Bastante bien, ¿eh? / necropost

Adam McCormick
fuente
6
cp -u ...
cp --update ...

También funciona.

softwarevamp
fuente
5

Otra forma de llamar al comando sin el alias es usar el commandbuiltin en bash.

command cp -rf /zzz/zzz/*

Steve Buzonas
fuente
4

-n es "no sobreescribir" pero su pregunta es totalmente opuesta a lo que respondiste.

Para evitar esta confirmación, simplemente puede ejecutar el comando cp con la ruta absoluta, evitará el alias.

/ bin / cp destino del archivo fuente

Rohit Rajput
fuente
2

Si desea mantener el alias a nivel global tal como está y solo desea cambiar su script.

Solo usa:

alias cp = cp

y luego escribe tus comandos de seguimiento.

Ankit Bhatnagar
fuente
0

Simplemente utilicé unalias para eliminar el alias "cp -i", luego hice la copia y luego volví a configurar el alias. :

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

No es el código más bonito, pero fácil de configurar y eficiente. También verifico que el alias ya está retrasado con un simple

alias |grep cp
Maat
fuente
-2

No es cp -i. Si no desea que se le pida confirmación, es cp -n; por ejemplo:

cp -n src dest

O en el caso de directorios / carpetas es:

cp -nr src_dir dest_dir
mihaitzateo
fuente
2
Otros afirmaron que el sistema vinculaba el cp de cara al usuario cp -i, lo que significa que estaban tratando de superar el valor predeterminado y forzar una sobrescritura. Parece que puede haber confundido que por ser la sintaxis sugerido, pero -nserá evitar una sobrescritura.
Carrito abandonado el