web-dev-qa-db-ja.com

グロブを使用している場合にのみ `rm`をインタラクティブにすることはできますか? (bashまたはzsh、あるいはその両方で)

シェルグロブで一度に複数のアイテムをrmし、パターンが予想以上に拡大する可能性がわずかでもある場合は常に、-iを追加することを忘れないようにしていますが、(もちろん)何か便利なものを忘れて、誤って吹き飛ばしてしまう可能性があります。 alias rm='rm -i'などのエイリアスを使用してこの問題を解決しようとする人もいますが、rmを常にインタラクティブにするというアイデアは嫌いです。常に-fを使用する習慣があり、それは明らかに目的全体を無効にします。

私がやりたいのは、グロブを使用するときにrm-iのみを使用するようにし、-f-iをオーバーライドするようにすることです。通常のrm -rf junkのディレクトリ全体。

したがって、rm *blah*は実際にはrm -i *blah*になりますが、rm blahは入力したとおりに機能します。

異なるシェルでこれを実現する方法に違いがある場合は、bashzshの両方のメソッドを提供する回答を選択します。どちらか一方をカバーします。


:これが必ずしも良い考えであると私は実際に確信していません。私はそれが可能かどうか尋ねているだけです。これがばかげた考えだと思うなら、あなたの意見の背後にある理由を聞いてとてもうれしいですが、そのようなコメントを回答フィールドに投稿しないでください。実際の答えは、これを行う方法を教えてくれるか、それが不可能である理由を説明します(または、同様の結果を得る別の方法を提供する可能性があります)。しかし、なぜこれがばかげているのかを教えてほしい場合は、コメントとして投稿してください。結論に同意できない場合でも、理にかなったコメントに賛成します。

15
iconoclast

簡単ではない。問題は、次のことを行う場合です。

rm -- *.txt

rmは、シェルによってすでに展開されているグロブパターンではなく、ファイルのリストを表示するだけです。

あなたにできることは(zsh):

alias rm='noglob rm'

これは、rmを呼び出すときにパターンを展開してはならないことをzshに伝えます。次に、rmを、展開自体を実行し、必要に応じて「-i」を追加する関数として再定義できます。

'rm'() {
  [[ "$*" = *[*[?]* ]] && set -- -i "$@"
  command rm $~@
}

ただし、このアプローチの問題は、この新しい「rm」では違いが見られないことです。

rm *

そして

rm '*'

*というファイルを削除するには、次のように書き込む必要があります。

rm [*]
9