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.