【问题标题】:How to force cp to overwrite without confirmation如何在不确认的情况下强制 cp 覆盖
【发布时间】:2022-01-11 23:04:39
【问题描述】:

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

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

【问题讨论】:

    标签: linux command-line overwrite cp


    【解决方案1】:

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

    cp manpage:只有指定-i参数时,cp才会在覆盖前真正提示。

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

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

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

    $ unalias cp
    

    【讨论】:

    • 是的,我做了 unalias cp -i ,现在它工作了。谢谢您的宝贵回复。
    • 只是“unalias cp”
    • 如果你使用 oh-my-zsh,这个 cp -i 别名可能来自 common-aliases
    【解决方案2】:

    您可以使用yes | cp -rf xxx yyy,但我的直觉是,如果您以 root 身份进行操作 - 您的 .bashrc.profile 的别名为 cpcp -i,大多数现代系统(主要是 RH 衍生) 对根配置文件执行此操作。

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

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

    您可以暂时绕过别名并使用命令的非别名版本,方法是在其前面加上 \,例如\cp whatever

    【讨论】:

    • 另外,要小心——即使别名不是直接写在 .bashrc 中,如果 anything else 这个文件调用最终会调用其他操作别名的东西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,这样您就可以验证它是否恢复为默认别名。
    【解决方案3】:

    这可能是由于cp 已经被别名为cp -i 之类的东西。直接调用cp 应该可以:

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

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

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

    【讨论】:

    • 是的,我做了 unalias cp -i ,现在它可以工作了。谢谢您的宝贵回复。
    • 我喜欢 unix 提供 yes 命令。好笑。有一天我可能会使用它。
    • 是的,它是别名,很好的捕捉 :) 你可以使用 \cp 调用原始 cp,比记住路径 /bin/cp 更容易
    • 是的,这是绕过别名的另一种方法。一种巧妙的技巧!
    • 这样比较安全。
    【解决方案4】:

    正如其他一些答案所述,您可能在某处使用别名,将cp 映射到cp -i 或类似的东西。您可以通过在命令前加上反斜杠来运行不带任何别名的命令。在您的情况下,请尝试

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

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

    【讨论】:

    • @zhouji 如我的回答所述,反冲会禁用别名。因此,\cp 不会调用别名cp,而是调用命令cp。这似乎相当于运行command cp
    【解决方案5】:

    默认情况下,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

    【讨论】:

      【解决方案6】:

      你也可以使用这个命令:

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

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

      【讨论】:

        【解决方案7】:

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

        command cp -rf /zzz/zzz/*

        【讨论】:

          【解决方案8】:

          cp 通常是这样的别名

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

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

          /bin/cp <arguments here> src dest
          

          【讨论】:

            【解决方案9】:

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

            cp -n src dest
            

            或者在目录/文件夹的情况下是:

            cp -nr src_dir dest_dir
            

            【讨论】:

            • 其他人说面向用户的 cp 被系统符号链接到 cp -i,这意味着他们试图克服默认值并强制覆盖。听起来您可能对建议的语法感到困惑,但-n防止覆盖。
            【解决方案10】:

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

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

            不是最漂亮的代码,但易于设置且高效。我还用一个简单的方法检查了别名是否已经设置了

            alias |grep cp
            

            【讨论】:

              【解决方案11】:

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

              您可以在cp 命令之前附加\ 以在没有别名的情况下使用它。

              \cp -fR source target
              

              【讨论】:

              • 如你所说,其他人已经说过了。为什么这得到了 45 票?
              • @phil294 我想这是最简单的方法,无需修改别名或删除可能对其他用途有用的 cp 别名。 ``这里非常有用。
              【解决方案12】:

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

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

              /bin/cp 源文件目的地

              【讨论】:

                【解决方案13】:

                如果您想在全局级别保持别名不变并且只想为您的脚本进行更改。

                只需使用:

                别名 cp=cp

                然后编写你的后续命令。

                【讨论】:

                  【解决方案14】:
                  cp -u ...
                  cp --update ...
                  

                  也可以。

                  【讨论】:

                    【解决方案15】:

                    【讨论】:

                      【解决方案16】:

                      所以我经常遇到这种情况,因为我将 cp 别名为 cp -iv,我发现了一个巧妙的技巧。事实证明,虽然-i-n 都取消了先前的覆盖指令,但-f 没有。但是,如果您使用-nf,它会增加清除-i 的功能。所以:

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

                      很整洁吧? /necropost

                      【讨论】:

                      • 它不会覆盖文件,只是抑制消息
                      • @Herrgott 你是说-f 不会强制覆盖吗?如果是这样,我预计会出现权限问题。 OP 的重点是清除 -i 指令的效果,使删除不是交互式的。
                      • 是的,在我的情况下它不起作用。 *user@pc-1250* /tmp/ttt: cp -f -- a/* b/cp: overwrite 'b/0'? 。如果我用-nf 调用它,它不会要求覆盖也不会覆盖(只复制丢失的文件)
                      • Coreutils v8.31
                      • 是的,Coreutils 的工作方式与我 Mac 上的 cp 命令不同。当根据gnu.org/software/coreutils/manual/coreutils.html#cp-invocation 使用-n 时,他们会明确忽略-f,您可以尝试--remove-destination 而不是-f
                      【解决方案17】:

                      对我来说最简单的方法:

                      yes | cp source destination
                      

                      【讨论】:

                        猜你喜欢
                        • 2019-11-20
                        • 2014-12-12
                        • 1970-01-01
                        • 2019-11-16
                        • 2019-12-31
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多