(更新:这种情况发生在 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
使~/.inputrc
bash 在制表符完成目录时不会自动添加斜杠。
答案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}
}