Come forzare cp a sovrascrivere senza conferma


668

Sto cercando di usare il cpcomando e forzare una sovrascrittura.

Ho provato cp -rf /foo/* /bar, ma mi viene ancora richiesto di confermare ogni sovrascrittura.

Risposte:


1113

Puoi farlo yes | cp -rf xxx yyy, ma il mio gutfeeling dice che se lo fai come root - il tuo .bashrco .profileha un alias di cpto cp -i, la maggior parte dei sistemi moderni (principalmente derivati ​​di RH) lo fanno sui profili di root.

È possibile controllare gli alias esistenti eseguendo aliasal prompt dei comandi o which cpper controllare solo gli alias cp.

Se hai definito un alias, l'esecuzione unalias cplo eliminerà per la sessione corrente, altrimenti puoi semplicemente rimuoverlo dal tuo profilo shell.

È possibile bypassare temporaneamente un alias e utilizzare la versione non alias di un comando aggiungendolo come prefisso \, ad es\cp whatever


3
Inoltre, essere cauti - anche se l'alias non è scritto direttamente in .bashrc, se niente altro Ciò richiede di file finisce per chiamare qualche altra cosa che manipola l'alias per cp, vi imbatterete in questo comportamento.
Jon

4
Con "sistemi moderni" intende RHEL / centos / fedora e forse qualcos'altro, Debian / Ubuntu non alias cp. Preferisco RHEL sul server e ho usato Fedora per quasi un decennio, ma il supporto della comunità di Ubuntu e il passaggio a Gnome mi hanno corteggiato dopo che Nvidia ha ucciso la mia installazione di Fedora. Ci sto ¯\_(ツ)_/¯parlando.
Ray Foss,

2
@RayFoss Aggiunta (primarily RH-derivatives)un'osservazione :)
favoretti

dopo aver eseguito unalias cpe copiato tutto ciò che è necessario copiare, è possibile ripristinare l'alias sui valori predefiniti alias cp='cp -i'. Dopodiché, esegui in alias cpmodo da poter verificare che sia tornato all'alias predefinito.
jaxarroyo,

287

Ciò è probabilmente causato cpdall'essere già alias di qualcosa del genere cp -i. La chiamata cpdiretta dovrebbe funzionare:

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

Un altro modo per aggirare questo è usare il yescomando:

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

6
si, ho fatto unalias cp -i, ora funziona .. Grazie per la tua preziosa risposta.
thiyagu114,

5
Adoro che unix fornisca il yescomando. Divertente. E un giorno potrei usarlo.
Matthew Leingang,

3
sì, era alias, bella cattura :) Puoi usare \ cp per chiamare il cp originale, più facile che ricordare il percorso / bin / cp
Hugo Zaragoza

Sì, questo è un altro modo per aggirare l'alias. Un po 'di un trucco pulito!
pgl

1
In questo modo è più sicuro.
plusmancn,

115

Come alcune delle altre risposte hanno affermato, probabilmente utilizza un qualche alias che associa cpal cp -io qualcosa di simile. È possibile eseguire un comando senza alias precedendolo con una barra rovesciata. Nel tuo caso, prova

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

La barra rovesciata disabiliterà temporaneamente tutti gli alias che hai chiamato cp.


2
@zhouji Il gioco disattiva l'alias, come indicato nella mia risposta. Quindi, invece di invocare l'alias cp, \cpinvocherà il comando cp. Questo sembra essere l'equivalente della corsa command cp.
Chris,

66

Probabilmente hai un alias da qualche parte, mappando cpa cp -i; perché con le impostazioni predefinite, cpnon chiederà di sovrascrivere. Controlla il tuo .bashrc, il tuo .profileecc.

Vedi la manpage cp : solo quando -iviene specificato il parametro verrà cpeffettivamente richiesto prima della sovrascrittura.

Puoi verificarlo tramite il aliascomando:

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

Per annullare la definizione dell'alias, utilizzare:

$ unalias cp

si, ho fatto unalias cp -i, ora funziona .. Grazie per la tua preziosa risposta.
thiyagu114,

1
è solo "unalias cp"
Krv Perera,

49

Come hanno affermato altre risposte, ciò potrebbe accadere se cpè un alias di cp -i.

Puoi aggiungere a \prima del cpcomando per usarlo senza alias.

\cp -fR source target

1
Come hai detto, altri lo hanno già dichiarato. Perché questo ha ottenuto 45 voti?
phil294,

@ phil294 Immagino che questo sia il modo più semplice senza modificare l'alias o rimuovere l'alias cp che può essere utile per altri usi. `` È molto utile qui.
Arnold Roa,

18

Di default cpha anche cp -i. Puoi controllarlo, digitare aliase puoi vedere alcuni come:

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'

Per risolvere questo problema basta usare il /bin/cp /from /tocomandocp /from /to


9

puoi usare anche questo comando:

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

aggiornerebbe il tuo file esistente con quello più recente però.


8

cp di solito è alias in questo modo

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

se sei sicuro di voler eseguire la sovrascrittura, usa questo:

/bin/cp <arguments here> src dest


7

Quindi mi imbatto molto in questo perché continuo a cp alias cp -ive ho trovato un trucco accurato. Si scopre che while -ied -nentrambi annullano le precedenti direttive di sovrascrittura, -fnon lo fanno. Tuttavia, se lo usi -nfaggiunge la possibilità di cancellare il -i. Così:

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

Abbastanza pulito eh? / necropost



5

Un altro modo per chiamare il comando senza l'alias è usare il commandbuiltin in bash.

command cp -rf /zzz/zzz/*


4

-n è "non sovrascrivere" ma la sua domanda è totalmente opposta a quella per cui hai risposto.

Per evitare questa conferma puoi semplicemente eseguire il comando cp con percorso assoluto, eviterà l'alias.

Destinazione del file sorgente / bin / cp


2

Se vuoi mantenere l'alias a livello globale così com'è e vuoi solo cambiare per il tuo script.

Usa solo:

alias cp = cp

e quindi scrivi i tuoi comandi di follow-up.


0

Ho semplicemente usato unalias per rimuovere l'alias "cp -i", quindi fare la copia, quindi ripristinare l'alias. :

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

Non è il codice più bello, ma facile da impostare ed efficiente. Controllo anche che l'alias sia già arretrato con un semplice

alias |grep cp

-2

Non lo è cp -i. Se non si desidera che venga chiesta conferma, lo è cp -n; per esempio:

cp -n src dest

O in caso di directory / cartelle è:

cp -nr src_dir dest_dir

2
Altri affermavano che il cp rivolto verso l'utente era collegato in modo simbolico cp -idal sistema, il che significa che stavano cercando di superare il valore predefinito e forzare una sovrascrittura. Suona come si può avere confuso che per essere la sintassi suggerito, ma -nsi impedisce una sovrascrittura.
Carrello abbandonato
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.