Bash
我只能在使用 globbing 時使“rm”互動嗎?(在 bash 或 zsh 或兩者中)
每當我
rm
使用 shell globbing 一次處理多個項目時,即使模式擴展到超出我預期的最微小的可能性,我總是會嘗試記住添加-i
,但是(當然)我可能會忘記並不小心吹走一些有用的東西。有些人試圖用別名來解決這個問題,例如alias rm='rm -i'
但我討厭讓 rm始終互動的想法,因為那樣我就會養成一直使用的習慣-f
,這顯然會破壞整個目的。我想做的是
rm
只-i
在我使用 globbing 時使用,-f
當然要覆蓋-i
,所以我仍然可以用通常的rm -rf junk
.因此
rm *blah*
確實會rm -i *blah*
,但rm blah
會完全按照輸入的方式工作。如果在不同的 shell 中實現這一點的方式存在差異,我將選擇一個為 bash和zsh 提供方法的答案,而不是僅涵蓋其中一個的答案。
注意:我實際上並不認為這一定是個好主意;我只是問有沒有可能。如果您認為這是一個愚蠢的想法,我很高興聽到您的意見背後的原因,但請不要在答案欄位中發布此類評論。真正的答案要麼告訴我如何做到這一點,要麼解釋它/為什麼不可能(或者可能提供一種替代方法來獲得類似的結果)。但是,如果您想告訴我為什麼這是愚蠢的,請發表評論。即使我不同意這個結論,我也會贊成有充分理由的評論。
這並不容易。問題是當你這樣做時:
rm -- *.txt
rm 只看到文件列表,而不是 shell 已經擴展的 globbing 模式。
你可以做的是(zsh):
alias rm='noglob rm'
這告訴 zsh 在呼叫 rm 時不應擴展模式。然後,您可以將 rm 重新定義為執行擴展本身並在需要時添加“-i”的函式,例如:
'rm'() { [[ "$*" = *[*[?]* ]] && set -- -i "$@" command rm $~@ }
這種方法的問題在於,這個新的“rm”看不出兩者之間的區別
rm *
和
rm '*'
要刪除名為 的文件
*
,您必須編寫它:rm [*]