如何强制cp覆盖而不确认
我试图使用cp
命令并强制覆盖。
我已经尝试过cp -rf /foo/* /bar
,但仍然会提示确认每个覆盖。
你可以做yes | cp -rf xxx yyy
yes | cp -rf xxx yyy
,但是我的感觉就是说如果你以root身份执行它,你的.bashrc
或者.profile
具有cp -i
的别名,大多数现代系统都会这样做。
您可以通过在命令提示符处运行alias
来检查现有的别名,或者可以使用which cp
来检查仅用于cp
别名。
如果你确定了一个别名,那么运行unalias cp
会取消当前会话,否则你可以从shellconfiguration文件中删除它。
你可以暂时绕过一个别名,使用命令的非别名版本作为前缀,例如\cp whatever
这可能是由于cp
已经被别名为cp -i
类的东西造成的。 直接调用cp
应该可以工作:
/bin/cp -rf /zzz/zzz/* /xxx/xxx
解决这个问题的另一种方法是使用yes
命令:
yes | cp -rf /zzz/zzz/* /xxx/xxx
正如其他一些答案所述,你可能使用了一个别名映射cp
到cp -i
或类似的地方。 您可以通过在前面加一个反斜杠来运行一个没有别名的命令。 在你的情况下,尝试
\cp -r /zzz/zzz/* /xxx/xxx
反斜杠将暂时禁用您称为cp
所有别名。
你可能有一个别名,将cp
映射到cp -i
; 因为使用默认设置, cp
不会要求覆盖。 检查你的.bashrc
,你的.profile
等
请参阅cp联机帮助页 :只有当指定了-i
参数时, cp
才会在覆盖前实际提示。
你可以通过alias
命令来检查:
$ alias alias cp='cp -i' alias diff='diff -u' ....
要取消定义别名,请使用:
$ unalias cp -i
正如其他答案所述,如果cp
是cp -i
的别名,则可能会发生这种情况。
您可以在cp
命令之前附加一个\
,以便在没有别名的情况下使用它。
\cp -fR source target
默认情况下, cp
具有别名到cp -i
。 你可以检查它,inputalias
,你可以看到一些像:
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
通常是这样的别名
alias cp='cp -i' # ie ask questions of overwriting
如果你确定你想要覆盖然后使用这个:
/bin/cp <arguments here> src dest
你也可以使用这个命令:
cp -ru /zzz/zzz/* /xxx/xxx
它会更新您现有的文件,但新的一个。
调用没有别名的命令的另一种方法是在bash中使用command
builtin。
command cp -rf /zzz/zzz/*
-n是“不要覆盖”,但他的问题与你所回答的完全相反。
为了避免这种确认,你可以简单的运行带有绝对path的cp命令,它将避免别名。
/ bin / cp源文件目标
如果你想保持在全球层面的别名,只是想改变你的脚本。
只要使用:
别名cp = cp
然后写下你的后续命令。
我只是使用unalias去除“cp -i”别名,然后执行复制,然后设置别名。 :
unalias cp cp -f foo foo.copy alias cp="cp -i"
不是最漂亮的代码,但易于设置和高效。 我也检查别名已经设置了一个简单的
alias |grep cp
这不是cp -i
。 如果你不想被要求确认,那就是cp -n
; 例如:
cp -n src dest
或者如果目录/文件夹是:
cp -nr src_dir dest_dir