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


15

たびに私rmシェルがグロブと少しでも可能性パターンが膨張し、私はそれが期待する以上のことがありますと一度に複数の項目、私はいつも追加することを忘れないようにしようとし-iたが、(もちろん)私は忘れ、誤って有益な何かを吹き飛ばすことができます。エイリアスを使用してこの問題を解決しようとする人もいますが、alias rm='rm -i'rmを常に対話型にするという考えは嫌い-fです。

私がやりたいのは、グロビングを使用rmする-iときにのみ使用し-f、もちろんオーバーライド-iすることrm -rf junkです。そのため、通常のでディレクトリ全体を吹き飛ばすことができます。

したがってrm *blah*、実際にはそうですrm -i *blah*rm blah、入力したとおりに動作します。

異なるシェルでこれを達成する方法に違いがある場合、どちらか一方のみをカバーする回答よりもbash zshの両方のメソッドを提供する回答を選択します。


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


7
いくつかの提案:GNUユーティリティでrm -I-i、3つ以上のファイル-rが渡されたとき、または渡されたときにのみトリガーするようなものです。でbashCtrl-x *キーボードショートカットを使用してグロブを展開し、自分で調べます。
jw013

2
bashでは、答えは「ノー」だと思います。zshのでは、あなたがの利点を取ることができるかもしれないnoglobへのrmをエイリアシングにより、例えばnoglob my-rm、その後、私の-RMはグロブをチェックすることをスクリプトであるた、それを展開し、-iか渡します。わからない、zshを知らない。
-derobert

@derobert:確かにzshをよく知っているように聞こえます。
iconoclast

@iconoclastいいえ、zshではなく、Googleだけです。奇妙なことに、私はそれをbashで行う方法を見つけようとするときにそれを見つけました。:-P
derobert

rmのように見えても実際には動作しないものが必要な場合は、スクリプト(またはエイリアス/ファンクション/ファンクションキー)を呼び出しmyrmて、そのスクリプトにすばらしいことをさせてください。
ウォルター

回答:


9

簡単ではない。問題は、次の場合です:

rm -- *.txt

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

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

alias rm='noglob rm'

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

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

ただし、このアプローチの問題は、この新しい「rm」が次の違いを認識しないことです。

rm *

そして

rm '*'

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

rm [*]

-1

おそらく他のシェルで、bashで動作します。あなたの場所.bashrc

function rm() { 
  while test "${1:0:1}" = "-"; do 
    shift
  done
  if test $# -eq 1; then 
    command rm "$1"
  else 
    command rm -i "$@"
  fi
}

3
command rmハードコーディングを避けるために使用できますPATH。また、rmオプションを取ることができるように、引数カウントをチェックするアプローチは少し信頼できません。
jw013

1
「$ 1」は引用符で囲む必要があります。そうしないと、渡された単一のファイルにスペースが含まれていると失敗します。@ jw013-コマンドをエスケープすることもできます、例えば\rm
ヨルダン

@jordanm $1二重引用符で引用する必要は正しいのですが、コマンドのエスケープについては間違っています。引用符はエイリアスのみを抑制し、関数検索は抑制しません。この回答は、エイリアスではなく機能を示唆しています。
jw013

1
少なくとも古い編集は機能していました-新しい編集はユーザーコマンドラインオプションを破棄しますが、これはおそらく正しいことではありません。
jw013

@ jw013-関数ではなく、エイリアスルックアップでのみ機能することを知りませんでした。情報のおかげで。
ヨルダン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.