web-dev-qa-db-fra.com

Comment forcer cp à écraser sans confirmation

J'essaie d'utiliser la commande cp et de forcer un écrasement.

J'ai essayé cp -rf /foo/* /bar, mais on me demande toujours de confirmer chaque remplacement.

580
thiyagu114

Vous pouvez faire yes | cp -rf xxx yyy, mais mon instinct dit que si vous le faites en tant que root - votre .bashrc ou .profile a un alias de cp à cp -i, most les systèmes modernes (principalement les dérivés de la RH) font cela aux profils de racines.

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

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

Vous pouvez contourner temporairement un alias et utiliser la version d'une commande sans alias en lui attribuant le préfixe \, par exemple. \cp whatever

1001
favoretti

Ceci est probablement dû au fait que cp est déjà associé à quelque chose comme cp -i. Appeler directement cp devrait fonctionner:

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

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

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

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

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

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

108
Chris

Vous avez probablement un alias quelque part, mappant cp à cp -i; car avec les paramètres par défaut, cp ne demandera pas d’écraser. Vérifiez votre .bashrc, votre .profile etc.

Voir page de manuel de cp : Uniquement lorsque le paramètre -i est spécifié, cp sera effectivement invité avant le remplacement.

Vous pouvez le vérifier via la commande alias:

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

Pour annuler l'alias, utilisez:

$ unalias cp
55
codeling

Comme d'autres réponses l'ont indiqué, cela pourrait se produire si cp est un alias de cp -i.

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

\cp -fR source target
43
Arnold Roa

Par défaut, cp est associé à cp -i. Vous pouvez le vérifier, tapez alias et vous pourrez en voir 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 commande /bin/cp /from /to à la place de cp /from /to

18
cp -u ...
cp --update ...

fonctionne aussi.

7
softwarevamp

cp est généralement aliasé comme ceci

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
7
user5035029

Une autre façon d’appeler la commande sans l’alias consiste à utiliser le command intégré dans bash.

command cp -rf /zzz/zzz/*

5
Steve Buzonas
5

vous pouvez aussi utiliser cette commande:

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

cependant, cela mettrait à jour votre fichier existant avec le plus récent.

5
sigeje

Si vous souhaitez conserver un alias au niveau global tel quel et que vous souhaitiez simplement changer pour votre script.

Il suffit d'utiliser:

alias cp = cp

puis écrivez vos commandes de suivi.

2
Ankit Bhatnagar

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

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

/ bin/cp source source file

2
Rohit Rajput

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

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

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

alias |grep cp
0
Maat