如何避免 cp -r ~/some/folder/ 。将所有文件复制到当前文件夹的顶层?

如何避免 cp -r ~/some/folder/ 。将所有文件复制到当前文件夹的顶层?

更新:这种情况发生在 Mac OS X 上——我使用的是 Mountain Lion。)有时我会使用按键tab来完成路径,所以我的命令可能是:

cp -r ~/some/folder/ .

但事实证明上面的行有不同的行为

cp -r ~/some/folder .

第二行会将文件夹复制到当前目录,如folder,但第一行会将所有 7 个文件、6 个子文件夹复制到当前目录,从而污染当前目录。由于我没有在特定的当前目录中使用 git 或 svn 进行任何源代码控制,因此实际上必须手动清理它,这非常痛苦。

有没有办法防止这种情况发生?例如通过创建函数、别名或 Bash 设置?我知道我可以记住这一点,但两个月后,我实际上可能会不小心再次做同样的事情,所以最好警惕这种行为。 (我宁愿需要使用cp -r ~/some/folder/* .cp -r ~/some/folder/.* .如果这是我真正想要的。)

答案1

要正确执行此操作需要重新解析 cp 的所有选项,这不是一个好主意。但这里有一些应该接近的东西:

# run cp command as-given, unless any argument ends in a slash
safecp() {
  for arg; do
    case $arg in */)
      echo "safecp: trailing slash in cp $*" >&2
      return 1
      ;;
    esac
  done
  cp "$@"
}

或者,尝试放置

set mark-directories off

使~/.inputrcbash 在制表符完成目录时不会自动添加斜杠。

答案2

你当然可以编写一个简短的 bash 函数(使用最新版本的 bash,它可以执行正则表达式,非常简单),它会捕获此类错误:

function cpr () {
    local src=...
    if [[ "$src" =~ /$ ]]; then
        # handle error
    else
        # proceed with copying
    fi 
}

棘手的部分是确定dest应该是什么(你当然想跳过目标目录),如果你想覆盖所有的cp选项组合(至少 GNU coreutilscp有 3 种不同的语法变体)。

使用专门的函数来就地纠正它可能会更好:

function cpr () {
    cp -R ${1%%/} ${2}
}

相关内容