改进“mv”以要求显式指定目标?

改进“mv”以要求显式指定目标?

由于使用时没有正确指定目标,我遇到了一些错误mv。详细信息请参见:

我们能否mv更安全地防范此类人为错误?

答案1

多年来,的语法mv已经深深地烙印在管理员和用户的脑海中,更不用说几乎无数的调用 mv 的脚本,因此更改用户界面会破坏很多。最好编写一个需要明确目标的包装器(或全新工具)。

答案2

添加额外保护以防止此类错误的最常见方法是将以下三个别名添加到 shell rc 文件中(在 bash 情况下为 ~/.bashrc):

alias cp="cp -i"
alias mv="mv -i"
alias rm="rm -i"

-i开关代表交互式,它会在覆盖或删除文件之前提示您。

rm还有对此的另一种改编:

-I                    prompt once before removing more than three files, or
                      when removing recursively.  Less intrusive than -i,
                      while still giving protection against most mistakes

答案3

命令无法知道扩展了哪些通配符来组成其参数。

在 zsh 中,您可以添加noglob命令前面的修饰符以防止通配符扩展。这允许您定义一个包装器,如果最后一个参数包含通配符,则该包装器将拒绝调用。

mv_check_last_argument () {
  local last
  setopt local_options null_glob
  last=(${~${(P)#}})
  if [[ $#last -eq 1 && $last[1] = ${(P)#} ]]; then
    command mv $~@[@]
  else
    echo 1>&2 "Not running mv because '${(P)#}' is a wildcard pattern"
    return 125
  fi
}
alias mv='noglob mv_check_last_argument'

(警告:未经测试的代码)

当您打算匹配单个目标目录时,这当然会剥夺您使用通配符的能力,但这通常不是很有用,因为您可以使用补全代替。当您确实想使用通配符时,请\mv …与反斜杠一起使用以抑制别名。

错误mv很容易撤消,除非您覆盖了现有的目标文件。为了避免覆盖目标文件,有一个简单的方法:运行mv -i而不是mv.这种方式mv仅执行移动文件的工作,并提示您是否需要执行删除文件的额外工作。再次,使用\mv …跳过别名并无条件覆盖目标(如果目标已存在)。

alias cp='cp -i' mv='mv -i'

相关内容