如何强制cp覆盖而无需确认


666

我正在尝试使用cp命令并强制覆盖。

我已经尝试过cp -rf /foo/* /bar,但是仍然提示我确认每个覆盖。

Answers:


1111

可以yes | cp -rf xxx yyy,但是我的固执己见地说,如果您以root用户身份进行操作-您的.bashrc.profile具有cpto 的别名cp -i,则大多数现代系统(主要是RH派生系统)都会对root用户配置文件进行操作。

您可以通过alias在命令提示符处运行来检查现有别名,或which cp仅检查的别名cp

如果确实定义了别名,则运行unalias cp将取消当前会话的别名,否则可以将其从shell配置文件中删除。

你可以暂时绕过一个别名,用前缀它使用命令的非走样版本\,如\cp whatever


3
此外,要小心-即使别名不直接写在.bashrc中,如果任何其他文件的调用最终调用其他方式的操纵别名CP,你会遇到这种行为。
2014年

4
他用“现代系统”表示RHEL / centos / fedora,也许还有其他含义,Debian / Ubuntu不为cp作别名。我更喜欢在服务器上使用RHEL并使用Fedora已有近十年的时间,但是在Nvidia杀死了我的Fedora安装之后,对Ubuntu的社区支持以及切换回Gnome的情况吸引了我。我知道¯\_(ツ)_/¯
雷·福斯

2
@RayFoss添加了(primarily RH-derivatives)评论:)
最爱的是

完成unalias cp并复制需要复制的内容后,可以通过执行操作将别名设置回其默认值alias cp='cp -i'。之后,运行,alias cp以便您可以验证它是否已恢复为默认别名。
jaxarroyo

287

这可能是由于cp已被别名为引起的cp -icp直接致电应该可以:

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

解决此问题的另一种方法是使用yes命令:

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

6
是的,我做了unalias cp -i,现在可以正常工作了。谢谢您的宝贵答复。
thiyagu114 2011年

5
我喜欢unix提供yes命令。搞笑 有一天我可能会使用它。
Matthew Leingang 2013年

3
是的,它是别名,漂亮的抓:)你可以使用\ CP调用原始CP,更容易记住比路径/斌/ CP
雨果萨拉戈萨

是的,这是绕过别名的另一种方法。有点整洁!
pgl

1
这样更安全。
plusmancn '16

115

由于一些其他的答案中所指出的,你可能会使用一个别名的地方它映射cpcp -i或类似的东西。您可以通过在命令前面加上反斜杠来运行不带任何别名的命令。根据您的情况,尝试

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

反斜杠将暂时禁用您已调用的任何别名cp


2
@zhouji如我的回答所述,反冲会禁用别名。因此cp\cp将调用命令而不是调用别名cp。这似乎等同于运行command cp
克里斯

66

您可能在某处有一个别名,映射cpcp -i; 因为使用默认设置,cp不会要求覆盖。检查您的.bashrc,您的.profile等等。

请参见cp手册页:仅当-i指定参数时,才会cp在覆盖之前实际提示。

您可以通过以下alias命令进行检查:

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

要取消定义别名,请使用:

$ unalias cp

是的,我做了unalias cp -i,现在可以正常工作了。谢谢您的宝贵答复。
thiyagu114 2011年

1
这只是“ unalias cp”
Krv Perera

49

如其他答案所述,如果cp是的别名,则可能会发生这种情况cp -i

您可以\cp命令前附加一个,以使用它而不使用别名。

\cp -fR source target

1
如您所说,其他人已经说过了。为什么要进行45次投票?
phil294

@ phil294我想这是最简单的方法,无需修改别名或删除cp别名,这可能对其他用法很有用。``在这里非常有用。
Arnold Roa

18

默认情况下cp,别名为cp -i。您可以检查它,键入alias并看到类似以下内容:

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'

要解决此问题,只需使用/bin/cp /from /to命令即可cp /from /to


9

您也可以使用以下命令:

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

它将用较新的文件更新您的现有文件。


8

cp 通常是这样的别名

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

如果您确定要覆盖,请使用以下命令:

/bin/cp <arguments here> src dest


7

所以我经常遇到这个问题,因为我将cp别名为cp -iv,并且发现了一个巧妙的技巧。事实证明,虽然-i-n都取消了先前的覆盖指令,-f但事实并非如此。但是,如果使用-nf它,则可以清除-i。所以:

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

相当整洁吧?/死角




4

-n是“不覆盖”,但他的问题与您的答复完全相反。

为了避免这种确认,您可以使用绝对路径简单地运行cp命令,它将避免使用别名。

/ bin / cp源文件目标



0

我只是使用unalias来删除“ cp -i”别名,然后执行复制,然后重新设置别名。:

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

不是最漂亮的代码,而是易于设置和高效的代码。我还用简单的方法检查别名是否已设置回

alias |grep cp

-2

不是cp -i。如果您不想被要求确认,则为cp -n; 例如:

cp -n src dest

或目录/文件夹为:

cp -nr src_dir dest_dir

2
其他人则指出,面向用户的cp cp -i已由系统链接到该链接,这意味着他们正试图克服默认值并强制覆盖。听起来您可能因为建议的语法而感到困惑,但-n可以防止覆盖。
被遗弃的购物车
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.