I'm trying to use the cp
command and force an overwrite.
I have tried cp -rf /foo/* /bar
, but I am still prompted to confirm each overwrite.
This question is related to
linux
command-line
overwrite
cp
I found this
'cp' -rf * /data/danalonso_testing/target/
you can use this command as well:
cp -ru /zzz/zzz/* /xxx/xxx
it would update your existing file with the newer one though.
cp -u ...
cp --update ...
also works.
By default cp
has aliase to cp -i
. You can check it, type alias
and you can see some like:
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'
To solve this problem just use /bin/cp /from /to
command instead cp /from /to
-n is "not to overwrite" but his question is totally opposite what you replied for.
To avoid this confirmation you can simply run the cp command wiht absolute path, it will avoid the alias.
/bin/cp sourcefile destination
This is probably caused by cp
being already aliased to something like cp -i
. Calling cp
directly should work:
/bin/cp -rf /zzz/zzz/* /xxx/xxx
Another way to get around this is to use the yes
command:
yes | cp -rf /zzz/zzz/* /xxx/xxx
So I run into this a lot because I keep cp aliased to cp -iv
, and I found a neat trick. It turns out that while -i
and -n
both cancel previous overwrite directives, -f
does not. However, if you use -nf
it adds the ability to clear the -i
. So:
cp -f /foo/* /bar <-- Prompt
cp -nf /foo/* /bar <-- No Prompt
Pretty neat huh? /necropost
cp
is usually aliased like this
alias cp='cp -i' # i.e. ask questions of overwriting
if you are sure that you want to do the overwrite then use this:
/bin/cp <arguments here> src dest
If you want to keep alias at the global level as is and just want to change for your script.
Just use:
alias cp=cp
and then write your follow up commands.
You probably have an alias somewhere, mapping cp
to cp -i
; because with the default settings, cp
won't ask to overwrite. Check your .bashrc
, your .profile
etc.
See cp manpage: Only when -i
parameter is specified will cp
actually prompt before overwriting.
You can check this via the alias
command:
$ alias
alias cp='cp -i'
alias diff='diff -u'
....
To undefine the alias, use:
$ unalias cp
It is not cp -i
. If you do not want to be asked for confirmation,
it is cp -n
; for example:
cp -n src dest
Or in case of directories/folders is:
cp -nr src_dir dest_dir
I simply used unalias to remove the "cp -i" alias, then do the copy, then set back the alias. :
unalias cp
cp -f foo foo.copy
alias cp="cp -i"
Not the most beautiful code, but easy to set and efficient. I also check the alias is already set back with a simple
alias |grep cp
As other answers have stated, this could happend if cp
is an alias of cp -i
.
You can append a \
before the cp
command to use it without alias.
\cp -fR source target
As some of the other answers have stated, you probably use an alias somewhere which maps cp
to cp -i
or something similar. You can run a command without any aliases by preceding it with a backslash. In your case, try
\cp -r /zzz/zzz/* /xxx/xxx
The backslash will temporarily disable any aliases you have called cp
.
Another way to call the command without the alias is to use the command
builtin in bash.
command cp -rf /zzz/zzz/*
Source: Stackoverflow.com