データを削除する時って、何だかとても緊張しますよね。
GUIでゴミ箱に入れるのであれば、大して緊張などしないのですが、コマンドで削除する時って、もしもの事があっても、リカバリーできないですから、緊張するのも無理はありません。
え?僕も、毎回ドキドキですし、過去に消してはいけないデータを余裕で削除したことありますよ。
普通にrmコマンド
ファイルを削除する場合は、rmコマンドなんですが、引数のファイルを指定する時に「*」(アスタリスク)で指定するときなどにミスが起こりやすいようです。
以前にもブログで書きましたが、引数で書いてはいけないモノもあるので、こうしたルールを知っておくことも非常に重要なんですね。
[トラブルレポート] サーバーコマンドで打ってはいけないファイル名 「./.*」
何にせよ、rmコマンドで、「やっちまった」人は、世の中に大量にいるようです。
やっちまったああああああああ@Linux板 | リククーブログ
そして、裏技ですが、もしもやっちまった時は、復元できる方法もあるようなので、困ったときは「lsof」を検索してみてください。
削除したファイルをlsofで復元する
でも、ハードディスクの構造を知っている人は、復元の精度の低さはよく理解出来ていると思いますが、ファイルの復元で、戻ってきたファイルって、経験上ほとんどないんですよね。
大量ファイルにはfind+rmコマンド
仕事でWEBサービスを公開している人などは、サーバー内のデータを削除する時に、大量のログ・ファイルなど、数万ファイルある時などで、
$ rm log*
みたいな事をやった時に、「ファイルが多すぎる」というエラーがでて削除が出来ないことあると思いますが、そういう時は、findコマンド使いますよね。
しかし、最近気がついたんですが、sambaアクセスしているサーバーなどであれば、GUI-OSで使っているファイル名をそのままのファイル名になっていて、
GUIのファイルでは、かなり色々なファイル名が文字列として許容されているので、トラブルに成ることも多々あります。
普通に考えると分かりますが、ファイル名で有効な半角スペースが、コマンドラインでNGになるという事は当たり前なんですが、エラーが出てしまうと露頭にくれてしまうんですよね。
$ find . |xargs rm
No such file or directory
こんなエラーですよね。
この場合は、下記のようにすると、大体解決できます。
$ find . -print0|xargs -0 rm
魔法のオプションですね"-print0"は、詳細は深く考えずに、xargsへの値引き渡しだと考えましょう。
findコマンドで他の書き方
上記のfind -print0オプションの他に、下記のように書いても半角スペースは対応できます。
$ find . | xargs -i rm "{}"
ファイル名毎に""(ダブルクォート)でくくるやり方ですが、ファイル名に"(ダブルクォート)が入っているとアウトなので、-print0を使ったほうが有効かもしれません。
-print0も弾かれる文字列があるんでしょうか???今度調査してみましょう。
さらに、上記の削除コマンドだと、カレントフォルダ以下が全て削除されてしまうので、下記のようにファイル名を限定してあげるといいでしょう。
$ find . -name "*.log" -print0|xargs -0 rm
こんなやり方いかがでしょう?
そして、コマンドラインでデータ削除する場合に、ゴミ箱機能のような機能を持たせる事を検討してみましょう。
まず、cronで特定のディレクト内を削除するバッチを作成しておき、削除したいファイルをそのディレクトリにmvするだけなんですが、
バッチファイルが実行されるまでは、復元が可能なので、コマンド打ち込んだ瞬間にきがつく「やっちまった」を回避することはできそうです。
しかし、大量のデータを削除する時って、ストレージを圧迫している時なので、緊急で容量を空けないといけない場合ですよね。
外部HDDを容易してUSBマウントして、移動しておくというのも、面倒くさいですが、安全ではありますね。
クラウドサーバーなどの場合はそうも行かないでしょうが、データの扱い、開発員の責任になってしまうので、なんとか安息の地を見つけたいですね。
0 件のコメント:
コメントを投稿