偶発的なrm -rf / *を防ぐにはどうすればよいですか?


164

私はrm -rf /*偶然に走りましたが、意味しましたrm -rf ./*(スラッシュの後の星に注意してください)。

alias rm='rm -i'そして--preserve-rootデフォルトでは私を救わなかったので、これのための自動安全装置はありますか?


私はrootではなく、すぐにコマンドをキャンセルしましたが、Bashプロンプトがすでに壊れていることに気付いたので、どこかで何かリラックスした許可がありました。私は、権限に依存するとされていないルート(私は同じミスを犯す可能性が望んでいないsudo)、と私はので、システムのどこかにファイルがない1の神秘的なバグのために狩りをしたくないので、バックアップをしてsudo良いです、しかし、私はこの特定の場合により良いものが欲しいです。


二度考えて、脳を使うことについて。実際に使用しています!しかし、私はそれを使用して、10種類の複雑なプログラミングタスクを解決しています。私はこのタスクに深く没頭しています。フラグとパスをチェックするための脳力は残っていません。コマンドと引数についても考えていません。「空の現在のディレクトリ」などのアクションについても考えています。私の脳の異なる部分がそれらをコマンドに変換し、時には間違いを犯します。少なくとも危険なものは、コンピューターに修正してほしい。


13
参考までに、あなたはあなたがいたどんなディレクトリrm -rf . /mydirでも代わりにやることができrm -rf ./mydirます。私はこれがより頻繁に起こると思います。
user606723

27
銃のアナロジーを使用するには、この質問は、銃が自分の足を狙っているのであって銃ではないことを銃に認識させてくださいと言いますが、そもそも銃を自分の足に向けないようにする責任はありません 銃とコンピューターは愚かであり、あなたが愚かなことをすると、これらの結果が得られます。銃の例えに沿って、警戒と練習を除いて、何もあなたを傷つけないようにします。
slillibri

73
@slillibri rmそれが銃ではないこと、コンピュータープログラムであることを除いて、ユーザーが重要なファイルを削除して警告を発することを決定するのに十分賢いかもしれませrm -rf /ん(星なしでやろうとする場合のように)。
バレンティンネムチェフ

80
@slillibri銃には安全性があります。rmコマンドの安全性を高める方法を尋ねることは、完全に正当なシステム管理者の質問です。
ジル

21
sudoをRM / binに/ RM はお勧めしませんが、ほとんどのRMの防止します :-)を
ポール

回答:


220

私が従うトリックの1つは、コマンドの#使用中に最初に置くことですrm

root@localhost:~# #rm -rf /

これによりrm、誤ったファイル/ディレクトリでの偶発的な実行が防止されます。確認したら#、最初から削除します。Bashで始まる#単語は、その単語とその行の残りのすべての文字を無視するため、このトリックは機能します。したがって、コマンドは単に無視されます。

または

重要なディレクトリを防ぎたい場合は、もう1つのトリックがあります。

-iそのディレクトリに名前の付いたファイルを作成します。このような奇妙なファイルはどのように作成できますか?touch -- -iまたはを使用してtouch ./-i

今すぐ試してくださいrm -rf *

sachin@sachin-ThinkPad-T420:~$ touch {1..4}
sachin@sachin-ThinkPad-T420:~$ touch -- -i
sachin@sachin-ThinkPad-T420:~$ ls
1  2  3  4  -i
sachin@sachin-ThinkPad-T420:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'? 

ここではコマンドラインに*展開さ-iれるため、最終的にコマンドはになりrm -rf -iます。したがって、コマンドは削除の前にプロンプ​​トを出します。あなたはこのファイルを置くことができ//home//etc/、など

または

--preserve-rootオプションとして使用しますrm。でrm、新しいに含まれcoreutilsたパッケージは、このオプションはデフォルトです。

--preserve-root
              do not remove `/' (default)

または

safe-rmを使用する

Webサイトからの抜粋:

Safe-rmは、/ bin / rmをラッパーで置き換えることにより、重要なファイルの偶発的な削除を防ぐための安全ツールです。

これらの保護されたファイルまたはディレクトリのいずれかを削除しようとすると、ユーザーは削除できず、代わりに警告メッセージが表示されます。

$ rm -rf /usr
Skipping /usr

10
安全-RMは...今に見て、非常によさそうだ
バレンティンNemcev

45
safe-rmは適切です。また、それは-iファイルの気の利いたトリックです。うん 愚かなバッシュ。
EricR

5
UNIXで行われている、ちょっとしたトリックは驚くべきことです。
WernerCD

4
-iという名前の作成ファイルは完全に純粋な天才です。約1年前に誤ってVPSでrm -rf / etc / *を実行したときに使用できました...(残念ながら、毎晩スナップショットを取得しているため、45分以内に復元できました)。
デビッドW

9
天才です。ソーサリーはtouch -- -rf
ミルチャヴトコヴィチ

46

あなたの問題:

誤ってrm -rf / *を実行しましたが、rm -rf ./*を意味しました(スラッシュの後の星に注意してください)。

解決策:それをしないでください!練習問題として、./パスの先頭で使用しないでください。スラッシュはコマンドに値を追加せず、混乱を引き起こすだけです。

./*はと同じことを意味する*ため、上記のコマンドは次のように記述する方が適切です。

rm -rf *

関連する問題があります。誰かがそれを想定しどこで、多くの場合、次の式を参照してくださいFOOのようなものに設定されています/home/puppies。これは今日、実際に主要なソフトウェアベンダーのドキュメントで見ました。

rm -rf $FOO/

しかし、FOOが設定されていない場合、これはに評価されrm -rf /、システム上のすべてのファイルを削除しようとします。末尾のスラッシュは不要なので、実際には使用しないでください。

以下も同じことを行い、システムを破損する可能性が低くなります。

rm -rf $FOO

これらのヒントを難しい方法で学びました。14年前に最初のスーパーユーザーアカウントを持っていたときrm -rf $FOO/、シェルスクリプト内から誤って実行し、システムを破壊しました。他の4人のシステム管理者はこれを見て、「うん。誰もが一度します。これがインストールメディア(36枚のフロッピーディスク)です。修正してください。」

他の人はここのようなソリューションをお勧めします--preserve-rootsafe-rm。ただし、これらのソリューションはすべてのUn * xe-variantsに存在するわけではなく、Solaris、FreeBSD、MacOSXでは動作しない可能性があります。さらに、safe-rm使用するすべての単一Linuxシステムに追加パッケージをインストールする必要があります。に依存しsafe-rmている場合、新しいジョブを開始し、safe-rmインストールしていないとどうなりますか?これらのツールは松葉杖であり、既知のデフォルトに依存して作業習慣を改善する方がはるかに優れています。


19
私の友人は彼が決して使用しないと言ったrm -rf *。彼は常に最初にディレクトリを変更し、特定のターゲットを使用します。その理由は、シェルの履歴を頻繁に使用するためであり、履歴にそのようなコマンドがあると、間違ったタイミングで表示されるのではないかと心配しています。
haggai_e

@haggai_e:良いヒント。私はUnixのに新しかったとき、私はかつてバグに遭遇走っrm -rf *も削除.して..。私はルートでしたが、これはのような下位のディレクトリに移動し、../../..かなり破壊的でした。それrm -rf *以来ずっと気をつけようとしています。
ステファンLasiewski

2
rm -rf $FOOあなたが必要なら助けませんrm -rf $FOO/$BARcd $FOO && rm -rf $BARずっと長くなりますが、助けになります。
ビクターセルギエンコ

5
@VictorSergienkoは、bashで、どのように指定する方法について${FOO:?}のように、rm -rf ${FOO:?}/rm -rf ${FOO:?}/${BAR:?}。それがそれを決して翻訳するのを防ぎrm -rf /ます。ここで私の答えにこれについての詳細があります
Acumenus

@haggai_e:これはこのトピックに関する最高のアドバイスの1つです。rm -rf *間違って間違ったディレクトリに変更したforループを使用して指をやけどし、他の何かを削除してしまいました。特定のターゲットを使用した場合、間違ったものを削除する可能性ははるかに低くなります。
リッチック

30

これは「Serverfault」にあるため、これを言いたいと思います。

多数のサーバーがあり、管理者/ユーザーの大規模なチームがいる場合、誰かがディレクトリに移動するrm -rfchown、間違ったディレクトリに移動します。

影響を受けるサービスを可能な限り最小のMTTRでバックアップする計画を立てる必要があります。


4
また、VMまたはスペアボックスを使用してリカバリを実行する必要があります。機能しなかったものを見つけて、上記の計画を改善します。私たちは2週間に1度の再起動を開始しています。建物に停電があり、そのたびに痛いからです。などのために/修正のinit.dスクリプトを自動化するためにビット我々が学ぶたびに-すべてのラックのいくつかの計画停止を行うことで、我々は今、約3時間に走り回っているのは数日後からそれをカットしました
ダニーステープル

そして、VMでこのコマンドを試してください。それは面白いです!ただし、最初にスナップショットを作成してください。
ステファンLasiewski

23

最善の解決策は、rm直接使用しないように習慣を変えることです。

1つのアプローチは、echo rm -rf /stuff/with/wildcards*最初に実行することです。ワイルドカードからの出力が適切であることを確認し、シェルの履歴を使用して、なしで前のコマンドを実行しechoます。

もう1つの方法は、echo削除する内容が目立たないほど明白な場合にコマンドを制限することです。ディレクトリ内のすべてのファイルを削除するのではなく、ディレクトリを削除して新しいディレクトリを作成します。良い方法は、既存のディレクトリの名前をに変更してからDELETE-foofoo適切な権限を持つ新しいディレクトリを作成し、最後にを削除することDELETE-fooです。この方法の副次的な利点は、履歴に入力されるコマンドがであることですrm -rf DELETE-foo

cd ..
mv somedir DELETE-somedir
mkdir somedir                 # or rsync -dgop DELETE-somedir somedir to preserve permissions
ls DELETE-somedir             # just to make sure we're deleting the right thing
rm -rf DELETE-somedir

ディレクトリを残す必要があるため(ファイルが常に存在している必要があるため、または再作成する権限がないため)大量のファイルを削除する場合は、ファイルを別のディレクトリに移動し、そのディレクトリを削除します。

mkdir ../DELETE_ME
mv * ../DELETE_ME
ls ../DELETE_ME
rm -rf ../DELETE_ME

Alt+ .キーを押します。)

内部からディレクトリを削除するのrm -rf .は魅力的です。なぜなら短いのでタイプミスのリスクが低いからです。残念ながら、典型的なシステムではそれができません。あなたがすることができますrm -rf -- "$PWD"タイプミスのリスクが高いと、代わりにそれらのほとんどは何も削除しないにつながります。これにより、シェルの履歴に危険なコマンドが残ることに注意してください。

可能な限り、バージョン管理を使用してください。あなたはしないrm、あなたcvs rmまたは何でも、それは取り消し可能です。

Zshにはrm、ディレクトリ内のすべてのファイルを一覧表示する引数を使用して、実行前にプロンプ​​トを表示するオプションがあります:(rm_star_silentデフォルトでオン)を実行する前にプロンプ​​トを表示しrm whatever/*rm_star_wait(デフォルトでオフ)確認できない10秒の遅延を追加します。プロンプトがすでに表示されるため、あるディレクトリ内のすべてのファイルを削除する場合、これは限定的な用途になります。それはのようなタイプミス防止に役立つことができますrm foo *のためにrm foo*

rmコマンドの変更を伴う、さらに多くのソリューションがあります。このアプローチの制限は、いつか本物のマシンにアクセスして、確認を期待して安全にをrm呼び出しrm、次にバックアップを復元するということです。


mv -t DELETE_ME -- *少し確実です。
東武

@Giles rm直接使用しないことをお勧めします!さらに優れた代替手段はfindコマンド使用することです。
aculich

また、ディレクトリを残す必要がある場合は、find somedir -type f -deletewhichを使用して、すべてのファイルを削除します somedirが、ディレクトリとすべてのサブディレクトリはそのままにして、非常に簡単に実行できます。
-aculich

19

あなたが言及したように、あなたはいつでもエイリアスを行うことができます:

what_the_hell_am_i_thinking() {
   echo "Stop." >&2
   echo "Seriously." >&2
   echo "You almost blew up your computer." >&2
   echo 'WHAT WERE YOU THINKING!?!?!' >&2
   echo "Please provide an excuse for yourself below: " 
   read 
   echo "I'm sorry, that's a pathetic excuse. You're fired."
   sleep 2
   telnet nyancat.dakko.us
}

alias rm -fr /*="what_the_hell_am_i_thinking"

また、コマンドラインtwitterクライアントと統合して、rm -fr /*rootとしてハードディスクを消去することで、自分がどの程度屈辱を受けているかを友人に警告することもできます。


3
telnet miku.acm.uiuc.eduの+1
アリ

1
エイリアスecho = "telnet miku.acm.uiuc.edu"
kubanczyk

私は十分に古い学校ではないはずです...の意味はtelnet miku.acm.uiuc.edu何ですか?
カイルストランド

試してみてください。非破壊的です。偏執狂的である場合は、VMで実行します。
ナフトゥリケイ

3
-1エイリアスは、無効な名前である* /おろか、その中にスペースでコマンドをすることはできません
xenithorb


15

偶発的な事態を防ぐための最も簡単な方法rm -rf /*は、rmコマンドのすべての使用を避けることです!実際、私はいつもrm /bin/rmコマンドを完全に取り除くために走りたがっています!いいえ、私は面白くありません。

代わりにコマンド-deleteオプションをfind使用しますが、最初にファイルを削除する前に、削除するファイルをプレビューすることをお勧めします。

find | less

findディレクトリの名前を省略した場合の最新バージョンでは、暗黙的に現在のディレクトリが使用されるため、上記は次と同等です。

find . | less

これらが削除するファイルであることを確認したら、-deleteオプションを追加できます。

find path/to/files -delete

したがって、find 使用する方安全であるだけでなく、表現力も優れているため、特定のパターンに一致するディレクトリ階層内の特定のファイルのみを削除する場合は、次のような式を使用してプレビューし、ファイルを削除できます:

find path/to/files -name '*~' | less
find path/to/files -name '*~' -delete

find安全rmであるだけでなく、学習して使用するには多くの正当な理由があるので、時間をかけて使用することを習得したなら、後で感謝しますfind


非常に興味深い議論。私はあなたのアプローチが好きで、小さな断片を作りました。findは3回まで呼び出されるため、非常に非効率的ですが、私にとってこれは良いスタートです:github.com/der-Daniel/fdel
Daniel Hitzel

14

このスレッドにはいくつかの本当に悪いアドバイスがありますが、幸いなことにそのほとんどは投票されていません。

まず、rootになる必要がある場合は、rootになります-sudoとさまざまなエイリアストリックにより、弱くなってしまいます。さらに悪いことに、彼らはあなたを不注意にします。正しい方法で物事を行うことを学び、あなたの保護のためにエイリアスに依存することを止めてください。ある日、トレーニングホイールのない箱に根付いて、何かを爆発させます。

第二に-あなたが根を持っているとき、自分自身を学童でいっぱいのバスを運転していると考えてください。ラジオで歌に揺れることもありますが、それ以外の場合は、両方を見て、速度を落として、すべてのミラーを再確認する必要があります。

第三に-あなたはめったに本当にしなければならないrm -rf-あなたがしたい可能性が高いですmv something something.bakmkdir _trash && mv something _trash/

ls4- 常に以前のワイルドカードrm-永遠に破壊する前に何かを見ることに夢中になることはありません。


2
+1を使用する場合ls
サチンディヴェカー

@eventiこのスレッドにはひどいアドバイスとadviceいハックがあることに同意します。そして、破壊する前に何かを見ることは間違いなく良い考えですが、findコマンドを使用してそれを行うより良い方法があります
aculich

findがどのように単純または安全であるかはわかりませんが、あなたのfind . -name '*~'例は気に入っています。私のポイントは、使用するls同じグロブをリストするというrmことです。
eventi

11

これは、rmのコンテキストでの正規表現に特化した私の標準ですが、この場合はあなたを救うでしょう。

echo foo*/[0-9]*{bar,baz}*正規表現が一致するものを確認するために、常に最初に行います。出力が得られたら、コマンドライン編集に戻ってに変更echorm -rfます。私は、今までに使用することはありませんrm -rfテストされていない正規表現に



5
OK、私は何を探していますか?ファイルマッチングの正規表現構文が、たとえばperlで使用されているものとは異なる(また、異なる名前で呼ばれることもある)ということを指摘していますか?または私が逃した他のポイント?私はここで土曜日の朝に最初のものだと思います私の思考の遅さをおaびします!
MadHatter

9
あなたが「正規表現」と呼んでいるこれらのものは、実際にはグロブです。別の正規表現構文ではありません。正規表現ではありません。
ブクゾール

1
その議論は確かになされ得る。ただし、正規表現に関するウィキペディアの記事から、「多くの最新のコンピューティングシステムは、ファイルシステムの一致するファイル名にワイルドカード文字を提供します。これは多くのコマンドラインシェルのコア機能であり、グロビングとしても知られています」- 「別名」の使用。これは、メタ文字を含むトークンを呼び出して、1つ以上のファイル名の正規表現に一致することを示すように思えます。グロビングは、ファイル名のマッチングで正規表現を使用する以外の意味がないため、より良い用語であることに同意します。
MadHatter

1
@MadHatterまた、グロビングは視覚的に多少似ていますが、正規表現とは意味的に非常に異なります。正規表現では、の意味は、それが適用される集合の0個以上の要素に一致する単項演算子であるKleene Star*と呼ばれる非常に正確な定義を持ちます(正規表現の場合、前の文字または文字の集合Kleene Star)、一方、グロビングでは、続くパターンのすべてに一致します。それらは、類似の構文を持っているように見える場合でも、意味的に非常に異なっています。*
-aculich

9

この問題の解決策は、定期的なバックアップを取ることです。失う危険を冒したくないものを作成するときはいつでも、それをバックアップしてください。定期的にバックアップするのが苦痛であると感じたら、プロセスを単純化して、痛みを感じさせないようにします。

たとえば、ソースコードで作業する場合git、コードをミラーリングし、別のマシンで履歴を保持するなどのツールを使用します。ドキュメントで作業する場合はrsync、ドキュメントを別のマシンに送信するスクリプトを用意してください。


btrfsなどのコピーオンライトファイルシステムも役立ちます。ローカルで(外部バックアップに加えて)実行される単純な自動スナップショットローテーションを簡単にセットアップできます。
マルス

6

このリスクを減らす最良の方法は、ほとんどのGUIのように2段階の削除を行うことです。つまり、rmを(同じボリューム上の)ゴミ箱ディレクトリに移動するものに置き換えます。その後、間違いに気付くために十分な時間が経過した後、そのゴミをきれいにします。

このようなユーティリティの1つであるtrash-cliは、Unix StackExchangeでここで説明されています


すべてのマシンに最初にインストールするものです。これはデフォルトの削除ツールである必要があります。rmは、現在何かを完全に削除する必要がある場合にのみ使用されます。私はそれがまだ離陸していないのが悲しいのですが、いつかはそうなるでしょう。おそらく、rmの非常に公開されたインスタンスが、バックアップでは対処できなかった大きな問題を引き起こした後です。おそらく、回復にかかる時間が非常に大きな要因となっているものです。
ジェリー

+1 Linuxを20年間使用した後、私はまだのようなゴミ箱の動作があるはずだと思いますrm
-Shovas

3

この種の間違いを避けるための重要な要素の1つは、rootアカウントを使用してログインしないことです。通常の非特権ユーザーを使用してログインする場合sudo、各コマンドに使用する必要があります。したがって、より注意する必要があります。


4
sudoがこのようなことを防ぐとは思いません。「rm」の前に「sudo」と入力しても、OPと同じタイプミスを作成できます。
cjc

1
編集にrootとして働い言及
バレンティンNemcev

それでも使用sudoとバックアップについて確信が持てない場合。:このページを見ていforum.synology.com/wiki/index.php/...を。ごみ箱の作成について説明します。お役に立てれば!
カレド

1
私はsudoのとバックアップを使用してい@Khaled、私はちょうどこの特定の問題のためのより良い何かしたい
バレンティンNemcev

3

ディレクトリを再帰的に削除するとき、コマンドの最後-r、そして-f該当する場合はを置きます。そのため、パス全体をまだ入力せずに誤ってEnterキーを誤って押した場合、コマンドは再帰的ではないため、無害である可能性があります。スラッシュを入力しようとしている間にEnterキーを押すと、ではなく書いた。rm /foo/bar -rf/foorm /foorm -rf /foo

GNU coreutilsを使用するシステムではうまく機能しますが、他のUnixのユーティリティでは、そのようなオプションを最後に配置することはできません。幸いなことに、私はそのようなシステムを頻繁に使用しません。


2

複雑かもしれませんが、SELinux内でロールをセットアップして、ユーザーがsudo su-(または通常のsu)でrootになったとしても、ファイルを削除する機能を制限できます(削除するにはrootとして直接ログインする必要があります)ファイル)。AppArmorを使用している場合、同様のことを行うことができます。

もちろん、他の解決策は、バックアップがあることを確認することです。:)


2

使用しないでくださいグロブ。Bashでは、を設定できますnoglob。しかし、再び、noglob設定されていないシステムに移動するとき、それを忘れて、あたかもそれがあったかのように進むかもしれません。

設定してnoclobber防ぐためにmvcp、あまりにもファイルを破壊します。

ファイルブラウザを使用して削除します。一部のファイルブラウザーはゴミ箱を提供します(たとえばKonqueror)。

グロビングを回避する別の方法は次のとおりです。コマンドラインで、I echo filenamepattern >> xxx。次に、Vimまたはviを使用してファイルを編集し、削除するファイルを確認し(filenmatesのファイル名パターン文字に注意してください)、%s/^/rm -f/各行を削除コマンドに変換します。ソースxxx。これにより、実行前に削除されるすべてのファイルが表示されます。

ファイルを「attic」ディレクトリまたはtarballに移動します。または、バージョン管理を使用します(前に述べました)。


削除する前にファイルをプレビューするいくつかの方法を使用する場合は+1を使用しますがfindコマンドを使用してより簡単で安全な方法があります
-aculich

2

ZSHはを実行する前に(デフォルトとして)私に尋ねますrm -rf *


1

以外ではchattr、rootにそのようなコマンドを実行させることからの保護策はそれほど多くありません。特権を実行する場合、適切なグループと注意深いコマンドが重要である理由です。

次回; 削除する予定のファイルをスコープします-から 'f'を省略するrm -rfか、使用findして渡すxargs rm


使用することをお勧めしますfind、私の答えではより安全な使用方法をお勧めします。のxargs rmすべての最新バージョンにfind-deleteオプションがあるため、使用する必要はありません。また、安全に使用するためにxargs rmあなたをも使用する必要があるfind -print0xargs -0 rmあなたがスペースを含むファイル名のようなものに遭遇したとき、そうでなければ、問題があるでしょう。
aculich

私のポイントは、xargsのニュアンスではなく、ファイルを削除してから続行することなく、まずfindを使用すること
でした

はい、使用するファイルをスコーピングすることfindは良い提案だと思いますが、使用することを提案する場合、そのニュアンスxargsは重要です-delete
-aculich

1

同様の災害を防ぐための他のコマンドのいくつかの安全エイリアスは、ここにあります

# safety features
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -I'                    # 'rm -i' prompts for every file
alias ln='ln -i'
alias chown='chown --preserve-root'
alias chmod='chmod --preserve-root'
alias chgrp='chgrp --preserve-root'

大文字-Iに注意してください、それは次とは異なります-i

3つ以上のファイルを削除する前に、または再帰的に削除するときに、プロンプトを1回表示します。-iよりも邪魔にならず、ほとんどのミスから保護します


Iオプションは、削除しようとしているものをエコーバックしませんが。
カルマリオス

1

通常、-vフラグを使用して何が削除されている^Cかを確認し、少しでも疑わしい場合はすぐに確認することができます。実際にはbad を防ぐ方法ではありませんrmが、これは何かがうまくいかない場合に損害を制限するのに役立ちます。


1

Unixベースのマシンでの削除プロセスは次のとおりです。

  • ls /path/to/intented/file_or_directory端末ウィンドウに入力し、ヒットreturn(またはTab、必要に応じて)して、ファイルのリストを表示します。

すべてがよさそうであれば、

  • up arrowキーをクリックしてls /path/to/intented/file_or_directory、端末の履歴から再度表示します。

  • 置き換えるlsrmrm -rまたはrm -rf必要に応じて、。私は個人的に-fフラグを使用したくない。

また、この検証プロセスにより、このプロセスを実行する前に、rmコマンドが時期尚早に実行されるのを防ぐことができます。


ファイルを削除する前に最初にプレビューすることは良い考えです。find 答えで説明しているように、より安全で表現力豊かな方法を使用してそれを行うことができます
aculich

1

あなたが今新しい習慣を習得する気分になっていない.bashrc/.profileなら、あなたが愚かなことをしようとしているかどうかをチェックするためにいくつかのテストを追加する良い場所です。私は自分の一日を台無しにするかもしれないパターンをgrepできるBash関数を考え出し、これを思いつきました:

alias rm='set -f; myrm' #set -f turns off wildcard expansion need to do it outside of           
                        #the function so that we get the "raw" string.
myrm() {
    ARGV="$*"
    set +f #opposite of set -f
    if echo "$ARGV" | grep -e '-rf /*' \
                           -e 'another scary pattern'
    then
        echo "Do Not Operate Heavy Machinery while under the influence of this medication"
        return 1
    else
        /bin/rm $@
    fi
}

それの良いところは、それがBashだけだということです。

その形式では明らかに十分に一般的ではありませんが、可能性があると思うので、いくつかのアイデアやコメントを投稿してください。


ファイルを削除する前にプレビューしようとするのは良いことですが、このソリューションは非常に複雑です。代わりにfindコマンドを使用してより一般的な方法でこれを非常に簡単に実行できます。また、「それについての良いところは、それがBashだけであるということです」と言う理由がわかりません。スクリプトでbash-isms避けることをお勧めします。
-aculich

「rm -rf ./*」および「rm -rf dir / *」を意味するときに「rm -rf / *」または「rm -rf dir / *」を防ぐには、パターン「/ *」を検出する必要があります。および「*」(単純に)。しかし、bashはワイルドカード引数を渡す前に展開するため、有害なパターンを探してgrepを介してすべてのコマンドライン引数を渡すことはできません(スターはフォルダーのすべてのコンテンツに展開されます)。「raw」引数文字列が必要です。「myrm」関数を呼び出す前にset -fを実行してから、未加工の引数文字列が渡され、grepは事前定義パターンを探します。*
kln

Bashでもset -f同等set -o noglobにあなたが何をしようとしているのか理解していますが、それでも「Bashだけが良いことだ」という声明を説明できません。代わりに、まったく使用せずコマンドを使用することでrm、シェルの一般的な方法で問題を完全に排除できます。実際にその提案を試してみて、ここで提案したものと比較してみてください。find
aculich

@aculich by bashのみPythonやperlの依存関係はありません。すべてをbashで行うことができます。.bashrcを修正したら、古い習慣を破ることなく作業を続けることができます。rm bashを呼び出すたびに、私は何か愚かなことをしないようにします。アラートを出したいパターンをいくつか定義する必要があります。「*」のように、現在のフォルダー内のすべてを削除します。今でも何度も必要なものになりますが、「myrm」にもう少し作業の対話性を追加できます。
kln

@aculich OK gotcha.No試したことがありません。ワークフローを大幅に変更する必要があると思います。Mac OS Xでここでチェックしたところ、私の.bash_historyは500で、そのうち27個のコマンドはrmです。そして最近では、端末をあまり使用しません。
kln

1

悲しいことに、カルマが不十分なため上記のコメントを残すことはできませんが、safe-rmは偶発的な大量削除の悪夢の万能薬ではないことを他の人に警告したかったのです。

以下は、Linux Mint 17.1仮想マシンでテストされました(これらのコマンドに不慣れな人への警告:これをしないでください!実際、これらのコマンドに精通している人でも、壊滅的なデータ損失を避けるためにこれを行うべきではありません)。

テキスト版(要約):

$ cd /
$ sudo safe-rm -rf *
$ ls
bash: /bin/ls: No such file or directory

イメージバージョン(フル):

ここに画像の説明を入力してください


1

私はごみ箱の窓アプローチが好きです。

私は通常、削除する必要があるものすべてのために「/ tmp / recyclebin」という名前のディレクトリを作成します。

mkdir /tmp/recyclebin

そして、決してrm -rfを使用せず、私は常に使用します:

mv target_folder /tmp/recyclebin

その後、スクリプトを使用して、または手動でごみ箱を空にします。


0

Hehe(テストされておらず、やや面白!):

$ cat /usr/local/bin/saferm

#! /bin/bash

/bin/ls -- "$@"

echo "Those be the files you're about to delete."
echo "Do you want to proceed (y/N)?"

read userresponse

if [ "$userresponse" -eq "y" ]; then

  echo "Executing...."
  /bin/rm -- "$@"

fi

その後:

alias rm="/usr/local/bin/saferm"

現実的には、そのような操作をグロブで実行する前に、ルートとして実行しているか、それに「sudo」を追加しているかなど、精神的な一時停止が必要です。同じグロブで「ls」を実行できます。しかし、精神的には、しばらく停止して、あなたが望むものをタイプしたことを確認し、あなたが望むものが実際にあなたが望むものであることを確認する、などです。これは主にUnix SA。ホットバーナーがストーブ上の何かが熱くなっているかもしれないことを教えてくれる良い先生です。

そして、適切なバックアップがあることを確認してください!


私は危険なことをする前に二度考えてみますが、どういうわけかそれが常に機能するとは限りません。
バレンティンネムチェフ

0

また、安全対策としてではなく、^ Cを押す前に削除されたファイルを見つける方法として、locateデータベースを使用できます(もちろん、インストールされて生き残った場合のみrm

私はこのブログ投稿からそれについて学びました


0

ZFSを使用して、誤って削除されないようにするために必要なファイルを保存し、次のデーモンを用意します。

  • このファイルシステムのスナップショットを定期的に作成します
  • 古い/不要なスナップショットを削除します。

ファイルが削除されたり、上書きされたり、破損したりした場合、ファイルシステムを最後の正常なスナップショットのクローンにロールバックすれば完了です。


0

答えではなく、ヒントです。私はいつもそうでrm (dir) -rfrm -rf (dir)ありません。可能な限り最後まで核に行かないでください。

Enterキーを滑らせたり叩いたりするなど、有効な削除であるような方法でdir名を太らせた状況を緩和するのに役立ちます。


スマートですが、BSD rmでは機能せず、ファイル名の前にオプションを指定する必要があります。
スベンパー

ええ。私は最近アップルのを使用してそれを見つけました。修正は、gnuツールをインストールし、すべてのエイリアスを設定することです:)および/またはできればリンゴをゴミ箱に捨てます。:)
Sirex


1
許可された場合、ナノ秒で。Linuxと比較するとゴミです。
Sirex

0

私はこれがシェルの拡張ショートカットで、強力な予防のヒントだと思う:

まず、キーを入力するrm -rf *rm -rf your/path/*Enterキーを入力しないでください。(もちろん、を使用するときにEnterキーをすばやく/誤って押さないように気を付ける習慣が必要ですrm -rf

次に、Alt-Shift-8(すなわちAlt-Shift-*)を押して、bashで「*」ワイルドカードを明示的に展開します。これにより、履歴をナビゲートするときに「rm -rf *」コマンドを再入力することも避けられます。

最後に、展開に正しいファイル/ディレクトリがあることを確認した後、Enterを押します。

できた


0

これが誰かが自分のケースのためにそこにいる場合に役立ちます

1.使用rmsafe

ファイルを「ごみ箱」フォルダーに移動し、いつでも簡単にそれらを戻すことができますmv

$ rmsafe /path/to/important/files

ソース:https : //github.com/pendashteh/rmsafe

2.使用safe

rmセーフを使用するためのエイリアスを設定できます:

$ alias rm="safe rm"

実行rm /*すると、応答でこれを取得します:

$ rm /*
Are you sure you want to 'rm /bin /boot /data /dev /etc /home /initrd.img /lib /lib64 /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var'? [y/n]

そして、私はあなたがタイプしないと信じていますy

ソース:https : //github.com/pendashteh/safe

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