コマンドラインからの“ゴミ箱”操作を可能にするユーティリティ

 デスクトップに置かれたゴミ箱(trashcan)にコマンドラインからアクセスしたいと考えているユーザは、 trash プロジェクトの開発成果を利用すればいいだろう。本稿で紹介するtrashコマンドで削除したファイルについては“undo”処理、つまりデスクトップ環境で行うゴミ箱中にあるファイルの復元に相当する操作が実行可能となるのだが、熟練Linuxユーザであれば、コマンドライン操作で特定ファイルをゴミ箱に移動させるといった用途においてtrashコマンドを重宝するかもしれない。

 trashはFreeDesktop.orgの定めるTrash Specificationを実装しているため、KDEデスクトップ環境に設けられているゴミ箱との親和性が非常に高い。これは例えばコマンドライン操作で削除したディレクトリであっても、削除後はゴミ箱中に置かれていることをKonquerorにて確認できるということだ。ただし残念ながらGNOME 2.20で実装されているゴミ箱に関しては、KDE 3.5.8やtrashコマンドと連携させることはできない。

インストールの手順

 現状でtrashは、Ubuntu、Fedora、openSUSEの各ディストリビューション用リポジトリから直接入手することはできない。私の場合は、64ビット版Fedora 8マシン上でバージョン0.1.10をソースコードからビルドしたものを使用している。このプログラム本体はPythonで記述されているので、インストール手順としてはpython setup.py installというコマンドを実行すればいい。

 ここであらかじめ注意しておくと、Linux Logical Volume Manager(LVM)を使用している場合にlist-trashコマンドを用いてゴミ箱中の収容項目を確認しようとすると、エラーが生じる可能性がある。trashバージョン0.1.10では利用可能なファイルシステムの検出にdfコマンドが使われているのだが、その際にはPOSIX互換モードの-Pを指定することなくdfが起動されるので、LVMデバイスの指定行が存在するとtrashにとっては想定外の改行が混入してしまうのだ。この問題は/usr/lib/python2.5/site-packages/libtrash.pyの460行目を変更することで対処可能で、具体的には下記のようにdfコマンドの起動オプションに-Pの指定を追加しておけばいい。

 
else: df_file=os.popen('df -P') while True:

 その他に私が遭遇した不具合としては、バインドマウントを用いて2つの異なる位置にファイルシステムをマウントしている場合、trashコマンド群の一部が機能しないというものがある。なおこのケースにおいてコマンドの実行に失敗してもValueError: path is not a mount point(マウントポイントへのパスではありません)というエラーメッセージが表示されるだけで、具体的にどのパスがマウントポイントでないと見なされているのかや、問題の解消法についての情報は何も提示されない。

実際の使用法

 trashプロジェクトから提供されているのは、empty-trash、list-trash、restore-trash、trashという4つのコマンドだが、これらのうち最後の1つがメインとなる基本コマンドであり、その他3つはコマンドラインから各種のゴミ箱操作をするサポートコマンドという位置付けと思っておけばいいだろう。またコマンドラインパラメータを指定できるのはempty-trashとtrashの2つのコマンドだけである。このうちempty-trashコマンドに指定できるパラメータは1つだけで、ここにはゴミ箱中で削除対象とする項目の基準日を指定する。例えばここに7を指定すると、ゴミ箱中に1週間以上置かれた古い項目がすべて削除される。もう1つのtrashコマンドに関してはファイルおよびディレクトリの名前をパラメータ指定できる他、rm(1)コマンドと同様の-d-f-i-rオプションも利用できる。ただし最後の4つのオプションは、単にrmコマンドと同じ指定をしても問題がないように用意されているだけのもので、trashコマンドにおいて実質的な意味を有すものではない。

 次にtrashコマンド群の具体的な実行例を見てみよう。

 
$ mkdir trashdir1 $ date >trashdir1/dfa.txt $ date >trashdir1/dfb.txt $ list-trash $ trash trashdir1 $ list-trash 2008-06-10 15:03:11 /home/ben/trashdir1 $ mkdir trashdir1 $ date >trashdir1/dfc.txt $ trash trashdir1 $ list-trash 2008-06-10 15:04:01 /home/ben/trashdir1 2008-06-10 15:03:11 /home/ben/trashdir1 $ restore-trash 0 2008-06-10 15:04:01 /home/ben/trashdir1 1 2008-06-10 15:03:11 /home/ben/trashdir1 What file to restore [0..1]: 0 $ l trashdir1/ total 8.0K -rw-rw-r-- 1 ben ben 29 2008-06-10 15:03 dfc.txt

 これを見ると分かるように、ゴミ箱中には同じ名前の項目を複数収めておくことが可能で、こうした同名項目は同じディレクトリから削除された場合でも共存できるようになっている。例えばこの実行例で行っているのは、ゴミ箱中にtrashdir1という同じ名前のディレクトリを2つ入れておき、そのうち新しい方だけを取り出すという操作である。

 restore-trashコマンドを使用する場合は、復元対象のファイルがゴミ箱に送られる前に属していたディレクトリにて実行しなければならない。例えば上記の実行例ではすべてのコマンドを私のhomeディレクトリ下にて実行しているので、restore-trashコマンドによる復元先は/home/ben/trashdir1とされているが、仮にこのコマンドを/tmpなどで実行していた場合、こうした復元先オプションは提示されなかったはずである。またこうした復元操作の仕様に起因して、誤ったディレクトリにてrestore-trashを実行してしまい“No trashed files”(ゴミ箱中にファイルはありません)というメッセージが表示される場合も出てくるはずだ。これは開発者サイドへの要望だが、この場合のメッセージとしては“No trashed files for directory X”(ディレクトリXについてはゴミ箱中のファイルはありません)のように、restore-trashの実行時には復元対象のファイルが属していたディレクトリに移動しておく必要があることを示唆する文面にしておいてほしかったところである。またスクリプト中に組み込んで利用する状況を考えると、restore-trashコマンドについてはパス指定ができると便利なはずで、指定した名前を持つ中で最も新しいファイルやディレクトリを復元させるという操作ができると使いやすくなるのではなかろうか。

 このように現行のtrashコマンド群におけるコマンドラインオプションの実装状況は、お世辞にも豊富とは言い難い充実度に止まっている。しかしながら、KDE 3のゴミ箱にコマンドラインからアクセス可能とするユーティリティの存在は、いったん実行したら復元不可能なrmコマンドを使わずに済むという点だけでも、コマンドライン操作をユーザに親しみやすいものとしてくれるはずだ。

Ben Martinは10年以上にわたってファイルシステムに取り組んでおり、博士課程の修了後、現在はlibferris、ファイルシステム、検索ソリューションを中心としたコンサルティング業に従事している。

Linux.com 原文