it-swarm.dev

Come forzare cp a sovrascrivere senza conferma

Sto cercando di usare il comando cp e forzare una sovrascrittura.

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

554
thiyagu114

Puoi fare yes | cp -rf xxx yyy, ma il mio gutfeeling dice che se lo fai come root - il tuo .bashrc o .profile ha un alias di cp in cp -i, la maggior parte dei sistemi moderni (principalmente derivati ​​di RH) lo fanno per i profili di root.

È possibile controllare gli alias esistenti eseguendo alias al prompt Prompt o which cp per controllare gli alias solo per cp.

Se hai definito un alias, l'esecuzione di unalias cp lo abolirà per la sessione corrente, altrimenti puoi semplicemente rimuoverlo dal tuo profilo Shell.

È possibile ignorare temporaneamente un alias e utilizzare la versione non alias di un comando aggiungendo il prefisso a \, ad es. \cp whatever

970
favoretti

Ciò è probabilmente causato da cp che è già alias in qualcosa come cp -i. Chiamare direttamente cp dovrebbe funzionare:

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

Un altro modo per aggirare questo è usare il comando yes:

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

Come hanno affermato alcune delle altre risposte, probabilmente utilizzerai un alias da qualche parte che mappa cp in cp -i o qualcosa di simile. È possibile eseguire un comando senza alias precedendolo con un backslash. Nel tuo caso, prova

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

Il backslash disabiliterà temporaneamente tutti gli alias che hai chiamato cp.

101
Chris

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

Vedi cp manpage : solo quando viene specificato il parametro -i la variabile cp richiede effettivamente la sovrascrittura.

Puoi verificarlo tramite il comando alias:

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

Per annullare la definizione dell'alias, utilizzare:

$ unalias cp
52
codeling

Come hanno affermato altre risposte, questo potrebbe accadere se cp sia un alias di cp -i.

Puoi aggiungere un \ prima del comando cp per usarlo senza alias.

\cp -fR source target
42
Arnold Roa

Di default cp ha il numero cp -i. Puoi controllarlo, digitare alias e 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 comando /bin/cp /from /to invece cp /from /to

18

cp è solitamente aliasato in questo modo

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

se sei sicuro di voler sovrascrivere, usa questo:

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

funziona anche.

6
softwarevamp

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

command cp -rf /zzz/zzz/*

5
Steve Buzonas

puoi usare anche questo comando:

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

tuttavia aggiornerebbe il tuo file esistente con quello più recente.

5
sigeje
4

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

Basta usare:

alias cp = cp

e poi scrivi i tuoi comandi di follow-up.

2
Ankit Bhatnagar

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

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

/bin/cp sourcefile destination

2
Rohit Rajput

Ho semplicemente usato unalias per rimuovere l'alias "cp -i", quindi eseguire la copia e 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à impostato con un semplice

alias |grep cp
0
Maat