我正在尝试使用cp命令并强制覆盖。
我已经尝试过cp -rf /foo/* /bar,但仍然提示我确认每个覆盖。
你可以做yes | cp -rf xxx yyy,但我的直觉告诉你,如果你把它作为根-你的.bashrc或.profile有一个cp到cp -i的别名,大多数现代系统(主要是rh衍生物)都会对根配置文件这样做。
您可以通过在命令提示下运行alias来检查现有别名,或者运行which cp来仅检查cp的别名。
如果您确实定义了别名,那么运行unalias cp将取消当前会话的别名,否则您只需将其从shell配置文件中删除即可。
您可以临时绕过别名,并使用命令的非别名版本,方法是将它与\前缀,例如\cp whatever前缀。
- Favoretti-你太棒了!它起作用了。:-)当我检查alias时,它列出了alias cp='cp-i',正如您建议我使用unalias cp一样。现在我可以复制任何promotor。帮了大忙,伙计。谢谢你。-)
- 另外,要小心——即使别名不是直接写在.bashrc中,如果这个文件调用的其他任何东西最终调用了其他一些操作cp别名的东西,您也会遇到这种情况。
- 令人惊叹的!谢谢:
- 我使用Linux已经10多年了,但在这种情况下,我从来没有意识到` to unalias. I used to use full path; like /usr/bin/cp'。非常感谢。
- "现代系统"的意思是rhel/centos/fedora,也许还有其他的意思,debian/ubuntu并没有化名cp。我更喜欢服务器上的rhel,使用fedora将近十年,但是在Nvidia杀死了我的fedora安装之后,ubuntu的社区支持和切换回gnome的做法吸引了我。我是¯\_(ツ)_/¯的人。
- @Rayfoss补充了一句(primarily RH-derivatives)的评论:
- 太棒了,谢谢。
- 在执行unalias cp并复制需要复制的内容之后,可以通过执行alias cp='cp -i'将别名设置回其默认值。之后,运行alias cp,这样您就可以验证它是否返回到默认别名。
这可能是由于cp已经被命名为类似cp -i的名称。直接呼叫cp应该可以工作:
1
| /bin/cp -rf /zzz/zzz/* /xxx/xxx |
另一种解决方法是使用yes命令:
1
| yes | cp -rf /zzz/zzz/* /xxx/xxx |
- 是的,我做过联合国艾滋病规划署的CP-I,现在开始工作了。感谢您宝贵的答复。
- 我喜欢Unix提供yes命令。令人捧腹的。总有一天我会用到它。
- 是的,它是别名,很好捕获:)您可以使用cp来调用原始cp,这比记住路径/bin/cp更容易。
- 是的,这是绕过别名的另一种方法。有点干净利落!
- 这样更安全。
- 这应该是公认的答案。
正如其他一些答案所述,您可能在某个地方使用了一个别名,它将cp映射到cp -i或类似的东西。通过在命令前面加上反斜杠,可以运行不带任何别名的命令。就你而言,试试看
1
| \cp -r /zzz/zzz/* /xxx/xxx |
反斜杠将暂时禁用您称为cp的任何别名。
- 暂时停用很好…非常感谢你,克里斯……
- @Thiyagu114没问题。欢迎光临。
- @周济的反冲禁用了化名,正如我在回答中所说的。因此,除了调用别名cp,\cp将调用命令cp。这似乎相当于运行command cp。
- @克里斯,我以前没仔细读过。谢谢!
您可能在某处有一个别名,将cp映射到cp -i;因为在默认设置下,cp不会要求覆盖。检查你的.bashrc,你的.profile等。
参见cp手册页:只有当指定了-i参数时,cp才会在覆盖前实际提示。
您可以通过alias命令检查:
1 2 3 4
| $ alias
alias cp='cp -i'
alias diff='diff -u'
.... |
要取消定义别名,请使用:
- 打我42秒!P
- 是的,我做过联合国艾滋病规划署的CP-I,现在开始工作了。感谢您宝贵的答复。
- 它只是"联合国艾滋病规划署"
如其他答案所述,如果cp是cp -i的别名,这可能发生。
您可以在cp命令之前附加一个\,以在不使用别名的情况下使用它。
默认情况下,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 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" |
不是最漂亮的代码,但易于设置和高效。我还检查别名是否已用简单的
不是cp -i。如果你不想被要求确认,它是cp -n;例如:
或者,如果目录/文件夹是:
- 其他人则表示,面向用户的CP被系统与cp -i进行了符号链接,这意味着他们试图克服默认值并强制覆盖。听起来您可能混淆了建议的语法,但-n将阻止覆盖。