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 je suis toujours invité à confirmer chaque réécriture.
14 réponses
Vous pouvez faire yes | cp -rf xxx yyy
, mais mon gutfeeling dit que si vous le faites en tant que root-votre .bashrc
ou .profile
a un alias de cp
à cp -i
, la plupart des systèmes modernes (principalement des dérivés RH) le font pour les profils racine.
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 un alias défini, l'exécution de unalias cp
supprimera cela pour la session en cours, sinon vous pouvez simplement le supprimer de votre shell profil.
Vous pouvez contourner temporairement un alias et utiliser la version non aliasée d'une commande en la préfixant par \
, par exemple \cp whatever
Cela est probablement dû au fait que cp
est déjà aliasé à quelque chose comme cp -i
. Appeler cp
directement devrait fonctionner:
/bin/cp -rf /zzz/zzz/* /xxx/xxx
Une autre façon de contourner cela est d'utiliser la commande yes
:
yes | cp -rf /zzz/zzz/* /xxx/xxx
Comme certaines des 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 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
.
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.
VoirCP manpage : ce n'est que lorsque le paramètre -i
est spécifié que cp
invite réellement avant d'écraser.
Vous pouvez vérifier cela via la commande alias
:
$ alias
alias cp='cp -i'
alias diff='diff -u'
....
Pour annuler l'alias, utilisez:
$ unalias cp -i
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 cp
commande de l'utiliser sans alias.
\cp -fR source target
Par défaut cp
a aliase à cp -i
. Vous pouvez le vérifier, tapez alias
et vous pouvez 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 cp /from /to
cp
est généralement un alias comme ceci
alias cp='cp -i' # i.e. ask questions of overwriting
Si vous êtes sûr de vouloir faire l'écrasement, utilisez ceci:
/bin/cp <arguments here> src dest
Vous pouvez également utiliser cette commande:
cp -ru /zzz/zzz/* /xxx/xxx
Il mettrait à jour votre fichier existant avec le plus récent cependant.
Une Autre façon d'appeler la commande sans l'alias est d'utiliser le command
builtin dans bash.
command cp -rf /zzz/zzz/*
- 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 source destination
Si vous voulez garder l'alias au niveau global tel quel et que vous voulez juste changer pour votre script.
Il suffit d'utiliser:
Alias cp=cp
Puis écrivez vos commandes de suivi.
J'ai simplement utilisé unalias pour supprimer l'alias "cp-I", puis faire la copie, puis reculer l'alias. :
unalias cp
cp -f foo foo.copy
alias cp="cp -i"
Pas le plus beau code, mais facile à définir et efficace. Je vérifie aussi que l'alias est déjà en retrait avec un simple
alias |grep cp
Ce n'est pas cp -i
. Si vous ne voulez pas qu'on vous demande une confirmation,
il est cp -n
; par exemple:
cp -n src dest
Ou dans le cas de répertoires / dossiers est:
cp -nr src_dir dest_dir