mvがターゲットフォルダを移動するのを防ぐ

mvがターゲットフォルダを移動するのを防ぐ

シンボリックリンクがbarフォルダを指している場合、foo次の2つのコマンドの動作は非常に異なります。

mv bar  baz   # rename link 'bar' to 'baz'
mv bar/ baz   # rename folder 'foo' to 'baz'

(OSXでbash 3.2とzsh 5.7.1を試しました)

私は2番目の動作が非常に危険だと思います(特に「タブ」にフォルダ名の後にスラッシュが含まれることが多いことを考慮して)、可能であればこれを避けたいと思います。ドキュメントにはmvこのオプションがないようです。mv私の関数のエイリアスが欠落しているので、この問題を解決するのに役立つBashオプションやzshオプションなどがありますか?

答え1

zshではそうしない限りunsetopt auto_remove_slash, zsh は完了後に末尾のスラッシュを削除します。完成にスラッシュを追加するため、baTab結果は得られますがbar/、押すSpaceかカーソルまたは挿入内容を除くほとんどの項目を移動するとzshが削除されます/。 (/ハイライトは「痛み」を意味します。)

スラッシュを使用してコマンドを入力すると、mv bar/ bazディレクトリの名前を変更することがfoo期待される動作です。bar/スラッシュで終わるので、パス名の解析はこれをfoo

この動作を回避するには、mvzshの場合はテストしないでください。

function mv {
  local i
  for ((i=1; i < $#; i++)); do
    if [[ $argv[$i] == *[^/]*/ ]]; then
      argv[$i]=${argv[i]%/}
    fi
  done
  command mv "$@"
}

この関数はやや純粋であることに注意してください。たとえば、ターゲットを削除しないで-tください。--target

関連情報