Directory

防止 mv 移動目標文件夾

  • June 24, 2020

如果符號連結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 選項或其他有助於解決此問題的選項?

在 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將目標作為不應剝離其尾部斜杠的參數。

引用自:https://unix.stackexchange.com/questions/594832