rmコマンドをptrashに置き換え、オペレーション・ミスを防ぐ
達人が語る,インフラエンジニアの心得:第7回 失敗を糧にしよう|gihyo.jp … 技術評論社
これを読んで触発されたのでrm代用コマンドについて書いてみようと思います。
ptrashとはrmの代用コマンドで、ファイルをホームディレクトリの.trashというゴミ箱ディレクトリを移動してくれる削除コマンドラインソフトです。
rmの場合、ファイルが有無を言わさず削除されてしまい、初歩的なミスが致命的なトラブルを巻き起こす可能性があるため、rmをptrashで代用します。
ptrashを利用するメリットして
- rmコマンドのようにファイルをいきなり削除しない
- 致命的なオペレーションミスを防げる(rm -rf / とか)
- ゴミ箱に移動したファイルを元の場所(パス)に戻せる
導入環境はCentOS 5.4です
yum -y install ptrash |
利用方法は非常に簡単。
ファイルをゴミ箱に移動する場合、($HOME/.trashというディレクトリは自動で作成されます)
ptrash file_name |
ファイルをゴミ箱から元の場所に戻す場合
($HOME/.trash/.trashdbというファイルが元の場所(パス)を管理しているようです)
ptrash -r file_name |
ファイルをゴミ箱から完全に削除する場合
ptrash -d file_name |
既ににゴミ箱に同名ディレクトリ、ファイルがある場合、自動で上書きされてしまうため
オプションに-iを付けて、上書き確認した方が良いかと思います。
その他のオプションは下記のような感じです。
OPTIONS
ptrash supports the following options
-d --delete
Delete file(s) from trash
-i Enables an interactive moving of files to/from trash. ie. It asks
for confirmation before over writing OR deleting any existing file.
-r --restore
Restore a file from trash to it’s original location
-h --help
Prints this short usage help
-v --verbose
Verbose operation mode
-V --version
Displays the version information |
最後にptrashをrmコマンドの代用として利用するようroot及び一般ユーザの.bashrcや.zshrcなどのエイリアスに追記しましょう。
PTRASH_PATH=`which ptrash` echo "alias rm='${PTRASH_PATH} -i'" >> $HOME/.bashrc echo "alias rm='${PTRASH_PATH} -i'" >> $HOME/.zshrc |
運用としてはスケルトンファイルにも記載しておいた方が良いと思います。
PTRASH_PATH=`which ptrash` echo "alias rm='${PTRASH_PATH} -i'" >> /etc/skel/.bashrc echo "alias rm='${PTRASH_PATH} -i'" >> /etc/skel/.zshrc |
ゴミ箱に移動したファイルは残ったままなので、私は下記のようなスクリプトをcronに登録し30日以上触ってないディレクトリ、ファイルを削除するようにしています。
#!/bin/sh find $HOME/.trash -daystart -ctime +30 | xargs -i /bin/rm -rf {} |
追記:2010年5月31日
ゴミファイルの定期削除はtmpwatchの方が良さそうと出来るサーバエンジニアlamanotramaさんからご教授いただいたので、修正。確かにこっちの方がシンプルですね。条件は720時間(30日)経過したファイル、ディレクトリを削除
#!/bin/sh tmpwatch -m 720 $HOME/.trash |
ptrashのオプションに-f というものがないので、万が一rm -rf / をやらかしてもptrashのエラーが返ってくるだけになります。sudoでのrm実行の際、環境変数を引き継がないので絶対にsudoではrmをやらないか、visudoで制限をかけましょう。
hogeユーザがsudoでrm(/bin/rm)を実行できないよう制限するには、visudoで下記のような感じで記載します。
Cmnd_Alias REMOVE = /bin/rm hoge ALL=(ALL) ALL, !REMOVE |
/bin/rm を利用する機会を減らすことで誤操作を無くしていきたいもんです。

