ユーザーがrmとワイルドカードの間に誤ったスペースを入力しないようにします


29

意図:

rm -rf string*

問題:

rm -rf string *

最初のケースはrmの正当かつ一般的な使用であり、小さなタイプミスは2番目のケースで多くの問題を引き起こす可能性があります。偶発的な後続または先頭のワイルドカードからスマートに保護する簡単な方法はありますか?


8
最近、適切に構成されたシェル(zshまたはbash)を使用して、リターンキーを押す前に(自動補完をトリガーするために)タブキーを押す習慣を身に
着け

2
touch -- -i引数にワイルドカードを含めると、パラメーターとして-i渡されるファイルが作成されます。rm-i
モニカの復活-M.シュレーダー

@MartinSchröder:ファイルが存在するディレクトリにいる場合。
追って通知があるまで一時停止します。

@MartinSchröderを入力しrm *た場合にのみ機能します。入力した場合rm name *、に展開されrm name -i other namesます。-iファイル名の前にないため、オプションとして処理されません。
バーマー

1
通常、ユーザーはこれを1回だけ実行します。
tedder42

回答:


37

DEBUG疑わしいと思われるコマンドをキャンセルするトラップを作成できます。以下に、またはそれに類似したコードをに追加できます~/.bashrc

shopt -s extdebug
checkcommand() {
  if [[ $BASH_COMMAND = 'rm -r'*' *' ]]; then
    echo "Suppressing rm -r command ending in a wildcard" >&2
    return 1
  fi
  # check for other commands here, if you like
  return 0
}
trap checkcommand DEBUG

好みに合わせてロジックを調整します。

(このアプローチが実際に役立つとは思っていません-コマンドを破壊的に混乱させて1つずつテストするのを見つけるにはあまりにも多くの方法がありますが、それは質問に対する文字通りの答えを提供します)。


47

システムを完全に防弾にする方法はありません。「本当によろしいですか?」物事へのプロンプトは逆効果であり、「もちろんだ」と思われます。ニークジャーク反応。

過去数年間に私が本から選んだトリックは、最初にls -R blah*それを行うことであり、それが見つかったrm -fr blah* 場合にのみ、リストが私がヒットしたいヒットした場合にのみ行い ます。

ls最初にコマンドを実行し、次にを削除してls -Rに置き換えるのは簡単rm -frです。

最後の質問は、「情報があなたにとって価値がある場合、バックアップはどこにありますか?」です。


4
上矢印ではなく^ls -R^rm -rf^、エイリアスとして設定できます
-exussum

FWIW、これはls -R私が基本的にいつもしていることですが、この時点でそれはとても直感的で、答えによって形成されたときに私の意識を滑らせました。そのため+1。
JakeGould

これには、Enterキーを押したり、マウスを押して改行で何かを貼り付けたりしても害がないという利点もあります。安全性を高めるために、あまり効率の悪い順序で入力することもあります。たとえばcat > .log、に戻って、の前にファイル名を貼り付けるか、ヤンクします.log。だから、私は> valuablefileコマンドラインに何もありません。
ピーターコーデス

にエイリアスされたrmを使用しているためrm -i、しばしばrmコマンドを作成\ してから行の先頭にa を入れます。(\rm単語の一部が引用されているため、rmのエイリアス展開を回避します)。私が必要な場合-r-f、ええ、私は時々で始まるls代わりにrm、または単にオフのまま-rfの部分を。?(編集、どのようにバックスラッシュを得るか、コードのフォーマットbquote bslash bslash bquoteは失敗します。
ピーター・コルド

8

たとえば、rmrf代わりに使用するように自分を訓練できますrm -rfか?

その場合、このbash関数は、コマンドを確認する前に実際に何が起こるかを確認する機会を提供します。

rmrf() { echo rm -rf "$@"; read -p "Proceed (y/N)? "; [ "${REPLY,,}" = y ] && rm -rf "$@"; }

この機能を永続的にするには、~/.bashrc使用する各コンピューターのファイルにこの行を追加します。

一般的なrmエイリアスとの比較

エイリアスを定義することは一般的です:

alias rm='rm -i'

これには2つの制限があります。

  1. このエイリアスに依存するようになった場合、マシン上またはそれを持たない環境にいるときにショックを受けることになります。対照的に、rmrfその関数なしでマシン上で実行しようとすると、無害なが返されcommand not foundます。

  2. -fコマンドラインで指定した-iオプションがエイリアスのオプションをオーバーライドするため、このエイリアスは役に立ちません。


4
悪くないアイデア。ただし、この機能がインストールされ、このユーザーが使用しているすべてのシステムで使用可能であることに依存します。それで、彼らはいくつかの作業のためにリモートサーバーにログインし、間違ったrm -rfコマンドを実行するとしましょう、どうなりますか?このような疑似関数を作成すると、最終的には単純なソリューションが複雑になります。より慎重になり、アクセス許可を理解するだけです。
JakeGould

4
@JakeGould 本当に必要な場合を除き、rm -fを使用しないでください
CVn

1
引数またはをチェックrmrfするシェル関数rmを作成するだけでなく、その場合に特別なロジックを実行するのではなく、なぜ実際にコマンドを呼び出すために直接呼び出すのではなく、-r-rfcommand rm "$@"rm
チャールズダフィー

3
別の名前を使用するため、オーバーライドが存在しないときに自分の足で撃たないようにします。そして、@MichaelKjörlingに同意し-fます-i。もし持っていなければ必要ありません。残す-fと、たとえば、読み取り専用ファイルを削除する前に警告が表示されます。
ピーターコーデス

6

私は間違ってファイルを削除すると、本当に大したことで、私がやったものの一つですが、のように、ゴミ箱フォルダを作るような状況にいる場合はmkdir trashcan、その後、私はスクリプト持っrmTrashcanているrm -rf trashcan/*か、rm -rf *または類似の、非常に慎重に書かれており、数回チェックしました。

そうすれば、私が間違いを犯した場合、その間違いはmvコマンドではなくrmコマンドにあります。私は一度lsとの自信を持って、正確に私が削除しています何を、rmTrashcan実際に安全に汚い仕事を行います。

また、バックアップを削除する必要がある状況でも非常に便利でした。私は可能性がmvゴミ箱に入れ、バックアップの全体月、mvいくつかの私は、背中のバックアップに、その後(毎月1日、月の15日を)維持したいrmTranshcan休息を。同様のコマンドをrm単独でls実行することは困難であり、この方法で実行すると、(削除しようとしているファイルを列挙するだけでなく)残しているファイルに自信を持ってバックアップできます


4

2つのコマンド(lsおよびrm)を使用する代わりに、より簡単で簡単な方法は次のように使用することfindです。

find . -maxdepth 1 -name "string*" -delete

誤って入力"string *"するとstring chars、and という名前のファイルが削除されますstring letters(とにかく必要なファイルです)が*、シェルのようにすべてのファイルを取得するわけではありません。

また、をオフに-deleteして、削除するファイルを確認し、上向き矢印を-delete押して、入力^ls -R^rm -rfや他のナンセンスよりも簡単に入力できます。


A findは、コマンドラインで宣言された明示的なパラメーターだけでなく、一致するファイルのネストされた検索を行います。これはマークを逃したと思います。私は間違っている可能性があります。
キラーミスト

3

偶発的な後続または先頭のワイルドカードからスマートに保護する簡単な方法はありますか?

あんまり。別の回答では、タスクを実行する前にプロンプ​​トを追加するカスタムコマンドを作成できると提案されています。ただし、このカスタムコマンドの問題は、作業中のシステムに意識的にインストールする必要があることです。そして、たとえインストールされていても、問題は、あなたの反射神経yを使ってタスクを完了させることです。

これは、テキスト/コマンドラインレベルであっても、すべてユーザーインターフェイスの問題です。あなたがすべきでないことをすることからあなたを守るためにいくつのセーフティネットがあるとあなたは期待しますか?はさみのようなものです。もしあなたが何とか怠慢で、布や紙を切るつもりで手を滑らせて切るなら、誰が悪いのでしょうか?または、信号機と一時停止標識でさえも、ドライバーが信号を無視したり、交通標識を無視したりすることは、そのような危険な行動に従事した場合に何が起こるかを鋭く認識すること以外にはありません。

つまり、最良の現実的なソリューションは、ユーザーとグループのシステム許可にあります。これは、ユーザーを自分自身から保護するための最良/唯一の真の安全策です。

自分だけがアクセスするシステムで作業している場合は、chmod 777すべてに誘惑されるかもしれませんが、それは合理的なシステムのセットアップ方法ではありません。代わりに755、すべてのディレクトリと644すべての非実行可能ファイルのアクセス許可が必要です。実行可能ファイルは755少なくとも必要がありますが、744他のユーザーにのみ読み取りを許可し、ファイルの実行は許可しない場合でも可能です。


2

フラグrmなしで最初のコマンドを作成してみてください-f。ただし、-i代わりに、rm削除するファイルごとにプロンプ​​トが表示されます。小さな再帰的な削除の場合y、コマンドが正しく入力されたことを確認したら、キーを押したままにすることができます。大規模な削除の場合、操作を中止し、コマンドライン履歴を使用してをに慎重に変更-iでき-fます。


実際には、y[RETURN]すべてのファイルを押す必要があります。GNUrmで押さえつけることはできません。-iコマンドを適切に入力したら、それを編集する方法があります。次に、読み取り専用ファイルでのみプロンプトが表示されます。
ピーターコーデス

1
rm -I一度だけプロンプトを表示し、潜在的に危険な削除(つまり、多くのファイル)に対してのみ使用するようにしてください。
Nick Matteo

1
あまり建設的でないフォーラムでは、「タイピング/校正がひどい場合、ワイルドカードで「rm -rf」を使用することはできません。-Iスイッチのことは知りませんでした... 20年前に入れられたに違いありません。「最後に「man rm」をしたとき。:)
ネビンウィリアムズ

2

rmは-i-Iすべての削除の前に確認するフラグとフラグを持っています。過去に、いくつかのディストリビューションはデフォルトでそれらをオンにしました。これはひどい考えです。通常の操作ではユーザーに確認ダイアログが多すぎると、ユーザーは習慣的に確認ダイアログを表示し始めます。これにより、要件が「注意」(常に赤旗)に変更され、より煩わしいダイアログになります。「はい。はい。はい。はい!はい!神よ、馬鹿げたコンピューターはファイルを削除するだけですYESYESYESYESYES--CRAP I MEANT NO!NOOOOOOO!」これは、「はい、しかし意味がありません」ダイアログの問題です。 この回答は、確認ダイアログが間違ったタイミングで表示される理由を視覚的に説明しています。

あなたが説明する一種の間違いは、「意図したものではなかったアクションのパフォーマンス」というスリップです。ユーザーは通常、間違いをすぐに認識し、その修正方法を正確に知っています。残念ながら、Unixはユーザーに機会を与えません。rmはすぐにファイルを削除します。他のすべてのオペレーティングシステムは、ごみ箱を使用して、少なくともしばらくの間、削除を取り消すことにより、この問題を解決します。

Unixにはさまざまなゴミ箱システムがありますが、この答えには提案がたくさんあります。

問題は、rmをエイリアスするか、rmをエイリアスしないかです。rmsのエイリアスの長所...

  1. rmの代替を使用することを忘れることはできません。

rmのエイリアス化の短所...

  1. あなたはそれを持っていないシステムでそれに頼るようになるかもしれません。
  2. ディスクがいっぱいになったときに問題が発生する場合があります。
  3. 定期的にゴミを空にするインフラが必要です。
  4. プログラムで期待されるrmの動作を妨げないように注意する必要があります。
  5. rmを完全にエミュレートしない場合があります。

最初の引数にあまり従うと、vi(vim、viではない)、csh(tcsh、cshではない)、および他の時代遅れのユーティリティを使用してしまいます。それでも、環境を過度にカスタマイズする危険があります。私は自分のユーティリティを持って行き、それをできるだけ簡単にすることを好みます。YMMV。

2つと3つは技術的な問題です。それらは、tmpreaperと同様に、ゴミのサイズをチェックし、定期的にクリーンアップするリーパーリーパージョブで解決できます。これはcronジョブの場合もあれば、より賢いバージョンが多くのデスクトップLinuxディストリビューションで利用可能なさまざまなファイルシステムイベントインフラストラクチャを利用する場合もあります。これは簡単なことではなく、効率的に行うのはさらに困難です。独自のシステムを作成するよりも、既存のシステムを見つける方が適切です。

4番目は、新しいrmをシェルエイリアスにすることで対処できますalias rm='trash'。そうすると、プログラムには影響しません。

5番目は、読者が解決すべき問題です。rmには多くのスイッチがありません。


私はrmにエイリアスされていますが、エイリアスのない動作を得るためrm -iによく使用\rmします。rm -i引数の1つにノーと言うために、計画中にいつでも入力します。ときどきコマンドlsとしてコマンドを開始し、完了したら\ rmのみを入力します。だから、rm -rf /代わりに/.../file
ピーター・コーデス

rm -Iあるいはrm --interactive=once、これまでよりもはるかに少ない迷惑ですrm -i、まだ危険なaythingキャッチ(以上3つのファイルがある場合、それはプロンプトだけを、あるいはそれが再帰的、および一度だけの代わりに、各ファイルのかどう。)
ニック・マッテオ

@Kundorはい、それは方程式を変更しません。おそらく、ユーザーがそれを無視する可能性が高くなります。ユーザーの目標は次のとおりです。プロンプトには、「削除するよう指示したばかりのアイテムを削除してもよろしいですか?」と表示されます。ユーザーは、何を削除するかを確認するのではなく、物を削除するという目標にまだ固執しているので、考えずに「はい」と言います。-iユーザーに目標​​を変更する時間を与える可能性があります。関連する質問に対するこの回答は、すべてを明らかにしています。
シュヴェルン

@Schwern:しかし、rm -iそれをオフにせずに30秒以上生きることはできません。一方rm -I、それはおそらくあなたが台無しにしたことだプロンプトだけ。プロンプトは大きな削除に対してのみ表示されます。いくつかの項目を削除しようとしたときにプロンプ​​トが表示されると、あなたは驚いて「foo *」と誤って入力したことに気付きます。
ニックマッテオ

@Kundor 3つ以上のファイルを削除し、再帰的に削除します(-rf私が発見した習慣によって確認は無効になっています)。サブディレクトリを削除したいというのはめったにありません。このメッセージは、ユーザーが確認したくない時点で有用な情報を追加せずに、ユーザーが何をしたかを確認するだけなので、役に立ちません。「rm:1つの引数を再帰的に削除しますか?」「はい、ディレクトリを削除します。そうするように言っただけです!...待って、どのディレクトリだったのですか?CRAP !!!」
シュヴェルン

2

!$最後のコマンドトリックの=最後の引数についてみんなに教えます。

% ls job[XYZ].*
jobX.out1
jobX.out2
[rest of the matches]

% rm !$

これにより、ワイルドカード拡張の検査が可能になり、その後にの前にスペースを挿入することなく、まったく同じグロブパターンを使用できます*

また、破壊的な可能性のあるコマンドラインで、ワイルドカードパターンを切り取ったり貼り付けたりしないでください。私自身の手で問題になっているからです:)

私の研究室の技術者が先週(3か月の作業)この間違いを犯しました-はい、バックアップがありました(1日遅れ)。


0

「もっと注意してください」、「適切な注意を払わないことに慣れてしまうので、エイリアス/確認のプロンプトを出さないでください」と言っているようです。

クール、そしてすべて。つまり、エイリアスを作成する必要はないと思いますrm(またrmrf、簡単に台無しにして実際のコマンドを入力できるためです)。

しかし、なぜエイリアス/スクリプトを作成し、それを呼び出して、たとえば、remove1つの引数(たとえば$ 1)だけを渡すことができないのですか?ワイルドカードは不注意なスペースのために2ドルである必要があります(わかりましたか?)はい、一度に(ワイルドカードを使用して)削除できるのは1セットのみですが、それが代金です。

何かいいものを書いていたら、削除する予定のファイルとディレクトリの数、削除するものの合計サイズを教えてもらい、確認を求めますが、それはあなたの流れを妨げるかもしれません。多分それをフラグオプションにしremoveますか?(-私)。それはだ場合にも、見にチェックを$ 1行いたいかもしれませんちょうどあなたが実際にしているディレクトリのリストは、単一のワイルドカードと確認を求め、そして。


余談ですが、そこには多くのrm代替品があります。多くは、UIデスクトップのゴミ箱に準拠しようとしています。それらのいくつかは調べる価値があるかもしれません。


6
「削除」エイリアスが一度に複数のファイルを削除することはありません。シェルはコマンドが表示する前にワイルドカードを展開するため、ワイルドカードは使用できません。
ヒミー

それで評価を行ってから、それをスクリプトに取り込みますか?
user3082

あなたはタイプしたいremove \*ですか?スクリプトがシェルに入力をグロブ拡張させる場合、それはあまり役に立たないと思います。
ピーターコーデス

0

非常に簡単なトリックは-rf最後に置くrm whatever* -rf
ことです:これはエラーレートを劇的に減らし*ます。
これはすべてを解決するわけではありません。毎日の簡単なトリックです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.