Comment forcer cp à écraser sans confirmation

668

J'essaie d'utiliser la cpcommande et de forcer un remplacement.

J'ai essayé cp -rf /foo/* /bar, mais je suis toujours invité à confirmer chaque remplacement.

thiyagu114
la source

Réponses:

1113

Vous pouvez le faire yes | cp -rf xxx yyy, mais mon intuition dit que si vous le faites en tant que root - votre .bashrcou .profilea un alias de cpto cp -i, la plupart des systèmes modernes (principalement des dérivés RH) le font pour les profils root.

Vous pouvez vérifier les alias existants en exécutant aliasà l'invite de commandes ou which cppour vérifier les alias uniquement pour cp.

Si vous avez défini un alias, l'exécution unalias cple supprimera pour la session en cours, sinon vous pouvez simplement le supprimer de votre profil de shell.

Vous pouvez contourner temporairement un alias et utiliser la version sans alias d'une commande en la préfixant avec \, par exemple\cp whatever

favoretti
la source
3
Aussi, méfiez-vous - même si l'alias n'est pas directement écrit en .bashrc, si quelque chose d' autre que ce fichier appelle finit par appeler quelque chose d'autre qui manipule l'alias pour cp, vous rencontrerez ce comportement.
Jon
4
Par «systèmes modernes», il entend RHEL / centos / fedora et peut-être autre chose, Debian / Ubuntu n'a pas d'alias cp. Je préfère RHEL sur le serveur et ai utilisé Fedora pendant près d'une décennie, mais le support communautaire d'Ubuntu et le retour à Gnome m'ont séduit après que Nvidia ait tué mon installation de Fedora. J'y suis ¯\_(ツ)_/¯.
Ray Foss
2
@RayFoss Ajout d'une (primarily RH-derivatives)remarque :)
favoretti
après avoir fait unalias cpet copié tout ce dont vous avez besoin pour copier, vous pouvez redonner à l'alias sa valeur par défaut en faisant alias cp='cp -i'. Après quoi, exécutez alias cppour pouvoir vérifier qu'il est de retour à l'alias par défaut.
jaxarroyo
287

Cela est probablement dû au fait cpqu'il a déjà un alias pour quelque chose comme cp -i. Appeler cpdirectement devrait fonctionner:

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

Une autre façon de contourner ce problème consiste à utiliser la yescommande:

yes | cp -rf /zzz/zzz/* /xxx/xxx
pgl
la source
6
oui, j'ai fait unalias cp -i, maintenant ça marche .. Merci pour votre précieuse réponse.
thiyagu114
5
J'adore qu'Unix fournisse la yescommande. Hilarant. Et un jour je pourrai l'utiliser.
Matthew Leingang
3
oui, il a été aliasé, belle capture :) Vous pouvez utiliser \ cp pour appeler le cp d'origine, plus facile que de se souvenir du chemin / bin / cp
Hugo Zaragoza
Oui, c'est une autre façon de contourner l'alias. Une sorte de hack soigné!
pgl
1
Cette façon est plus sûre.
plusmancn
115

Comme certaines des autres réponses l'ont indiqué, vous utilisez probablement un alias quelque part qui correspond cpà cp -iou quelque chose de similaire. Vous pouvez exécuter une commande sans aucun alias en la précédant d'une barre oblique inverse. Dans votre cas, essayez

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

La barre oblique inverse désactivera temporairement tous les alias que vous avez appelés cp.

Chris
la source
2
@zhouji La réaction inverse désactive l'alias, comme indiqué dans ma réponse. Ainsi, au lieu d'invoquer l'alias cp, \cpinvoquera la commande cp. Cela semble être l'équivalent de l'exécution command cp.
Chris
66

Vous avez probablement un alias quelque part, mappé cpà cp -i; car avec les paramètres par défaut, cpne demandera pas d'écraser. Vérifiez votre .bashrc, votre .profileetc.

Voir la page de manuel de cp : Uniquement lorsque le -iparamètre est spécifié, une cpinvite s'affiche avant l'écrasement.

Vous pouvez le vérifier via la aliascommande:

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

Pour annuler la définition de l'alias, utilisez:

$ unalias cp
codeling
la source
oui, j'ai fait unalias cp -i, maintenant ça marche .. Merci pour votre précieuse réponse.
thiyagu114
1
c'est juste "unalias cp"
Krv Perera
49

Comme d'autres réponses l'ont indiqué, cela pourrait arriver s'il cps'agit d'un alias de cp -i.

Vous pouvez ajouter un \avant la cpcommande pour l'utiliser sans alias.

\cp -fR source target
Arnold Roa
la source
1
Comme vous l'avez dit, d'autres l'ont déjà dit. Pourquoi cela at-il obtenu 45 votes positifs?
phil294
@ phil294 Je suppose que c'est le moyen le plus simple sans modifier l'alias ni supprimer l'alias cp qui peut être utile pour d'autres utilisations. `` C'est très utile ici.
Arnold Roa
18

Par défaut cpa aliase pour cp -i. Vous pouvez le vérifier, taper aliaset vous pouvez voir certains comme:

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'

Pour résoudre ce problème, utilisez simplement la /bin/cp /from /tocommande à la placecp /from /to

Avseiytsev Dmitriy
la source
9

vous pouvez également utiliser cette commande:

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

il mettrait à jour votre fichier existant avec le plus récent.

sigeje
la source
8

cp est généralement aliasé comme ça

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

si vous êtes sûr de vouloir écraser, utilisez ceci:

/bin/cp <arguments here> src dest
user5035029
la source
7

Donc, je rencontre beaucoup cela parce que je garde l'alias cp cp -iv, et j'ai trouvé une astuce intéressante. Il s'avère que while -iet les -ndeux annulent les directives de remplacement précédentes, -fne le fait pas. Cependant, si vous l'utilisez, vous pouvez -nfeffacer le -i. Donc:

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

Assez bien hein? / nécropost

Adam McCormick
la source
6
cp -u ...
cp --update ...

fonctionne également.

softwarevamp
la source
5

Une autre façon d'appeler la commande sans l'alias est d'utiliser le commandbuiltin dans bash.

command cp -rf /zzz/zzz/*

Steve Buzonas
la source
4

-n est "ne pas écraser" mais sa question est totalement opposée à ce que vous avez répondu.

Pour éviter cette confirmation, vous pouvez simplement exécuter la commande cp avec un chemin absolu, cela évitera l'alias.

/ bin / cp destination du fichier source

Rohit Rajput
la source
2

Si vous souhaitez conserver l'alias au niveau global tel quel et que vous souhaitez simplement le modifier pour votre script.

Utilisez simplement:

alias cp = cp

puis écrivez vos commandes de suivi.

Ankit Bhatnagar
la source
0

J'ai simplement utilisé unalias pour supprimer l'alias "cp -i", puis faire la copie, puis réinitialiser l'alias. :

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

Pas le code le plus beau, mais facile à définir et efficace. Je vérifie également que l'alias est déjà en retrait avec un simple

alias |grep cp
Maat
la source
-2

Ce n'est pas le cas cp -i. Si vous ne voulez pas qu'on vous demande de confirmation, c'est cp -n; par exemple:

cp -n src dest

Ou dans le cas de répertoires / dossiers:

cp -nr src_dir dest_dir
mihaitzateo
la source
2
D'autres ont déclaré que le cp accessible à l'utilisateur était lié cp -ipar le système, ce qui signifie qu'ils essayaient de surmonter la valeur par défaut et de forcer un écrasement. On dirait que vous avez peut - être confus que pour être la syntaxe suggérée, mais -nva éviter un écrasement.
Panier abandonné