如果符号链接bar
指向文件夹foo
,则以下两个命令具有非常不同的行为:
mv bar baz # rename link 'bar' to 'baz'
mv bar/ baz # rename folder 'foo' to 'baz'
(在 OSX 上尝试过 bash 3.2 和 zsh 5.7.1)。
我发现第二种行为非常危险(特别是考虑到“选项卡”通常用尾部斜杠来完成文件夹名称),并且希望尽可能阻止它。手册mv
似乎没有这个选项。由于缺少mv
我自己的函数的别名,是否有 Bash 选项或 zsh 选项或其他选项可以帮助解决此问题?
答案1
在 zsh 中,只要你不这样做unsetopt auto_remove_slash
, zsh 删除完成末尾的尾部斜杠。它在完成过程中添加了一个斜杠,因此ba
Tab结果是bar/
,但是如果您按Space(或移动光标或除插入内容之外的大多数其他操作),zsh 会删除/
. (/
突出显示表示它是“忍受”。)
如果您最终输入带有斜杠的命令mv bar/ baz
,则重命名目录foo
是预期的行为。由于bar/
以斜杠结尾,路径名解析会将其转换为foo
.
如果您想避免这种行为,则必须为mv
.未经测试,对于 zsh:
function mv {
local i
for ((i=1; i < $#; i++)); do
if [[ $argv[$i] == *[^/]*/ ]]; then
argv[$i]=${argv[i]%/}
fi
done
command mv "$@"
}
请注意,这个函数相当幼稚,例如它不理解-t
/--target
将目的地作为参数,而该目的地不应被删除。