防止 mv 移动目标文件夹

防止 mv 移动目标文件夹

如果符号链接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 删除完成末尾的尾部斜杠。它在完成过程中添加了一个斜杠,因此baTab结果是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将目的地作为参数,而该目的地不应被删除。

相关内容