使用 `cp -f -R` 的复制命令奇怪地不适用于所有 OS X 机器

Copy command with `cp -f -R` strangely does not work on all OS X machines

我在 OS X El Capitan。我有 2 个目录 SourceDir & DestDir,结构如下。

ParentDir/SourceDir |-s_dir1/ss_dir1
                    |-s_dir2

ParentDir/DestDir |-s_dir1/ss_dir2
                  |-ddir1
                  |-ddir2
                  |-ddir3

我想执行复制命令,使 ParentDir/SourceDir 中的 s_dir1ParentDir/DestDir 中的 s_dir1 合并,此外,s_dir2被放入 ParentDir/DestDir。所以,复制后 ParentDir/DestDir 应该是这样的:

ParentDir/DestDir |-s_dir1/ss_dir1
                  |-s_dir1/ss_dir2
                  |-s_dir2
                  |-ddir1
                  |-ddir2
                  |-ddir3

我使用以下命令复制:
cp -f -R ParentDir/SourceDir/ ParentDir/DestDir/

在 MacOSSierra 上一切正常。但奇怪的是,它在装有 MacOS El Capitan 的 OS X 机器上不起作用。我再次在我同事的机器上用 MacOS El Capitan 试了一下。它工作正常!

怎么了?

不同版本的 MacOS El Capitancp command 的行为是否不同?

或者,我是否需要更改 El Capitan 上的复制命令语法?

如何在我的 MacOS El Capitan 机器上执行复制命令以确保至少在所有 OSX台机器?

请不要建议将 El Capitan 机器升级到 Sierra。这不是我的选择。因此发布了这个问题以获得 copy command.

的一些其他语法选项

标准 cp 命令似乎被其他东西覆盖了。您可以通过显式指定 /bin/cp 强制它使用标准 cp 命令。您也可以尝试使用别名之类的东西来覆盖当前覆盖,但最好找出当前覆盖是什么,它来自哪里,然后(也许)摆脱它。

要做的第一件事是 运行 type cp 它的输出告诉你 cp 当前正在做什么:

  • 如果它打印类似 "cp is /usr/local/bin/cp" 的内容,那么您已经安装了自定义安装的 cp 版本,它覆盖了标准版本...并且显然会导致问题。你最好的选择是找出安装了非标准 cp 命令(也许是自制软件?)的内容并将其删除。
  • 如果它打印类似 "cp is aliased to <some command string>" 的内容,那么您在 shell 初始化文件之一(或 运行 等文件之一)中定义了一个别名。检查 ~/.profile、~/.bash_profile、~/.bash_login 和 ~/.bashrc 以获取别名定义的来源。
  • 如果它打印 "cp is a function",那么您的 shell 初始化文件之一中定义了一个函数。像检查别名定义一样检查。

我的诀窍是必须以超级用户身份递归地执行 cp 命令。

不知道为什么

sudo /bin/cp -R -v -p source destination

-v 显示每个文件的复制进度。

干杯

格雷格