Linuxでごみ箱にファイルを捨てるコマンドを作ってみた。
Linuxごみ箱 †
最近のLinuxのデスクトップ環境では普通、ユーザーごとにゴミ箱ディレクトリが設定されており、 ファイルマネージャでファイルを削除する時は、一旦このディレクトリに移動される。
しかし、端末を使っているときにファイルを削除するときはrm
コマンドを使う。
rm
はうっかり使うと取り返しのつかないことになるのでなんとか端末からゴミ箱に捨てたいが、
「ゴミ箱に捨てる」コマンドはデフォルトでは(多分)存在しない。
ということで、「ゴミ箱に捨てる」コマンドをPerlで書いてみた。
ゴミ箱設定 †
ta
コマンドを使うには、前もってゴミ箱ディレクトリを設定しておく必要がある。
ゴミ箱ディレクトリは、ストレージデバイスごとに設定する。
*1
ゴミ箱ディレクトリはスクリプト前半の%TRASH_DIR
という連想配列に、
「デバイスファイル」=>「ゴミ箱ディレクトリ」という形で記述する。
%TRASH_DIR = ( "/dev/hda1" => "$USER_HOME/.Trash", "/dev/hda2" => "/media/hda2/.Trash-$USER_NAME" );
すると、/dev/hda1に格納されているファイルは~/.Trashに捨てられるようになる。
UUIDを使った表記も可能。(udevがUUIDによるリンクを作ってくれればだけど)
'/dev/disk/by-uuid/b2da-b964' => '/mnt/disk/trash'
使い方 †
- file1 file2を捨てる(ディレクトリも可)
$ ta file1 file2
- ゴミ箱の中身を閲覧する
$ ta -v
- ゴミ箱を空にする
$ ta -D
対応するゴミ箱がない場合 †
もし、捨てようとするファイルが%TRASH_DIR
に記述されていないデバイス内にある場合、taコマンドは失敗する。
しかし、-rオプションを付けることでゴミ箱を経由せずに削除することができる。
ta -r /media/hda5/hogehoge.txt
閲覧形式のカスタマイズ †
@CMD_VIEW
という配列にはゴミ箱閲覧(-v, -vvオプション)のためのコマンドが記述される。
デフォルトではls
が設定されているが、カスタマイズが可能である。
$CMD_VIEW[0]
が-vオプションに対応し、
$CMD_VIEW[1]
が-vvオプションに対応する。
実は、$CMD_VIEW[2]
などを追加していくと、
それに応じて-vvvオプションなども使えるようになる。
一言 †
もちろん、同じようなこと考える人はいるわけで。 例えば、
- http://code.google.com/p/trash-cli/ trach_cli
Pythonによる実装。 freedesktop.orgのゴミ箱規格 に準拠しているので、GNOMEやKDEのゴミ箱を操作できる。 実用上はこっちの方が役に立つと思う。
ただ、taコマンドをfreedesktop.org標準に準拠させる気はない。理由は、
- freedesktop.org標準は色んな環境を想定しているので、真面目に準拠しようと思ったらかなり大変。
- freedesktop.org標準では捨てたファイルのメタデータ(捨てたファイルの元の場所はどこかとか)を記述したファイルを合わせて管理する必要がある。 「ゴミ箱ディレクトリがあって、そこにファイルを放り込む」というシンプルな実装の方が自分は好き。
- 自分で使う限りにおいて、上記のメタデータは必要ない。一旦捨てたものは95%そのまま削除される。
- 自分はGUIのファイルマネージャ使わないのでGNOMEやKDEのゴミ箱と連携が取れなくても構わない。
- ゴミ箱ディレクトリをスクリプト中に明示するという仕様の方が、安心感がある。
まあ、taは自分好みに作ってあるということ。
履歴 †
- 2009/05/30 Ver 1.01
- ハイフンから始まるファイルを捨てられないバグを解消
- 2008/08/03 Ver 1.00
- リンク先の切れたシンボリックリンクを捨てられないバグを解消
- ディレクトリを指すシンボリックリンクの名前の後ろに/をつけてtaを呼び出すと 参照先が捨てられてしまうバグを解消。
- ようやくバージョン番号を記載。
- -m オプションでゴミ箱作成に失敗した場合、エラーを出して終了するようにした。
- system関数の使い方を改め、ファイル名エスケープの手間を省いた。
- 2008/06/28 ゴミ箱の中身を見る機能、ゴミ箱を空にする機能を追加
- 2007/05/09 メタ文字を含むファイルを捨てられないバグを修正。
- 2007/05/06 改良型ゴミ箱コマンド開発。
- 2007/03/20 旧型ゴミ箱コマンド開発。
*1 このようにデバイスを分けるのは効率化のため。例えば、HDDが2台あり、ゴミ箱がhdaのみに存在する場合、もし捨てるファイルがhdbにあるとすると、ファイルを捨てるたびにディスク間でファイルデータのコピーを行う必要がある。これでは非常に効率が悪い。また、リムーバブルディスク上のファイルを捨てる時はゴミ箱を経由せず削除するのが普通である。