关于Linux:如何在不确认的情况下强制CP覆盖

How to force cp to overwrite without confirmation

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

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


你可以做yes | cp -rf xxx yyy,但我的直觉告诉你,如果你把它作为根-你的.bashrc.profile有一个cpcp -i的别名,大多数现代系统(主要是rh衍生物)都会对根配置文件这样做。

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

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

您可以临时绕过别名,并使用命令的非别名版本,方法是将它与\前缀,例如\cp whatever前缀。


这可能是由于cp已经被命名为类似cp -i的名称。直接呼叫cp应该可以工作:

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

另一种解决方法是使用yes命令:

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


正如其他一些答案所述,您可能在某个地方使用了一个别名,它将cp映射到cp -i或类似的东西。通过在命令前面加上反斜杠,可以运行不带任何别名的命令。就你而言,试试看

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

反斜杠将暂时禁用您称为cp的任何别名。


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

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

您可以通过alias命令检查:

1
2
3
4
$ alias
alias cp='cp -i'
alias diff='diff -u'
....

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

1
$ unalias cp


如其他答案所述,如果cpcp -i的别名,这可能发生。

您可以在cp命令之前附加一个\,以在不使用别名的情况下使用它。

1
\cp -fR source target


默认情况下,cp具有cp -i的别名。您可以检查它,键入alias,您可以看到如下内容:

1
2
3
4
5
6
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命令。


cp的别名通常如下

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

如果您确定要进行覆盖,请使用:

1
/bin/cp  src dest


1
2
cp -u ...
cp --update ...

也可以工作。


您也可以使用此命令:

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

不过,它会用新文件更新现有文件。


调用不带别名的命令的另一种方法是在bash中使用command内置。

command cp -rf /zzz/zzz/*


我发现了这个

1
'cp' -rf * /data/danalonso_testing/target/

来源:https://superuser.com/questions/358843/how-to-replace-all-the-contents-from-one-folder-with-another-one/358851


如果您想保持别名在全局级别不变,只想为脚本更改别名。

只需使用:

别名CP=CP

然后写下你的后续命令。


-n是"不改写",但他的问题与你的回答完全相反。

为了避免这种确认,您只需使用绝对路径运行cp命令,它将避免使用别名。

/bin/cp源文件目标


我只是使用unalias删除"cp-i"别名,然后进行复制,然后设置别名。:

1
2
3
unalias cp  
cp -f foo foo.copy  
alias cp="cp -i"

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

1
alias |grep cp

不是cp -i。如果你不想被要求确认,它是cp -n;例如:

1
cp -n src dest

或者,如果目录/文件夹是:

1
cp -nr src_dir dest_dir