ゴミ箱に関する Linux 向けコマンドラインツール tt (trash-tool)を作りました





Freedesktop.org のゴミ箱の仕様に準拠したコマンドラインツール tt (trash-tool) を書きました。この記事はインストール方法や使い方を日本語で書いたものです。





概要

Freedesktop.org のゴミ箱の仕様に準拠した Linux 向けコマンドラインツールです。Windows や MacOS はサポートしていません。 出来る事としては、ファイルやディレクトリのゴミ箱への移動、ゴミ箱の中身の表示、ゴミ箱を空にする、ゴミ箱から元の場所に復元する、です。

特徴

  • 安全な削除: 削除コマンドの rm の代わりに使うことで、誤って完全に削除するといったことを防げます。
  • 仕様の準拠: Freedesktop.org のゴミ箱の仕様に従って .trashinfo ファイルを作成します。これは、nautilusや nemo, thunar などのファイルマネージャと同じなので、コマンドラインでゴミ箱に移動させたファイルやティレクトリをファイルマネージャで表示したゴミ箱から復元できます。また、逆も同様です。
  • 重複の回避: ゴミ箱に移動したファイルなどと同名のファイルがゴミ箱に既に存在していた場合には、番号を振って上書きを回避します。これも既存のファイルマネージャなどと同じです。
  • リスト表示: ゴミ箱内のアイテムを ls コマンドの様に表示できます。
  • アイテムの復元: ゴミ箱内のアイテムを fuzzy finder を使って選択・復元できます。
  • ゴミ箱を空にする: ゴミ箱を全て空にできます。
  • マルチデバイス: すベてのファイルシステム(外付けドライブやUSBなど)に対して、ゴミ箱への移動、リスト表示、ゴミ箱を空にする、ゴミ箱から復元ができます。ただし、別のファイルシステムへの移動などはコピーが発生するため出来ないようになっています。

インストール

Github の Releases からダウンロードしてパスが通った場所へ配置してください。

unzip tt-v0.10.0-linux-amd64.zip 
chmod 755 tt
mv tt /usr/local/bin/

使い方

ゴミ箱への移動

現在居るファイルシステムのゴミ箱へファイルやディレクトリを移動します。

tt file.txt directory/ *.star

ゴミ箱のリスト表示

ls -a と同様にグリッド表示します。

tt
# or
tt -d

何もオプションを指定しない場合は現在のディレクトリに対応するゴミ箱を表示します。-a,--all オプションを指定するとすベてのゴミ箱を表示できます。

tt -a
# or
tt -ad

すベてのゴミ箱を ls -al の様に表示します。

tt -al

ゴミ箱を空にする

確認のあとに現在のディレクトリに対応するゴミ箱を空にします。

tt -e

確認なしてゴミ箱を空にします。

tt -y
# or
tt -ey

すベてのゴミ箱を削除します。

tt -ae
# or
tt -ay

ゴミ箱から復元

現在のディレクトリに対応するゴミ箱から復元します。fuzzy finder が起動して選択できます。

tt -r

すベてのゴミ箱から復元対象を選択できます。

tt -ar

fuzzy finder (skim) の設定

.bashrc などに以下のように環境変数を設定することで設定できます。

export TRASH_TOOL_OPTIONS="--multi --layout reverse --height 50%"

fuzzy finderskim のオプションをコマンドラインで指定する方法です。環境変数より優先されます。

tt -r ui --multi --layout reverse --height 50%

設定可能な skim のオプションを表示する。

tt ui --help

プログラムの詳細な仕様

プログラム仕様の概要

本プログラムは、Freedesktop.org のゴミ箱の仕様 Version 1.0 に基づいて実装された、標準的なデスクトップ環境のゴミ箱機能と高い互換性を持ったコマンドラインからゴミ箱を操作するためのツールです。ファイルの安全な移動(ゴミ箱へ)、完全に削除、ゴミ箱の内容表示、および復元機能を提供します。

用語解説

  • $topdir: 異なるファイルシステム(パーティションやリムーバブルデバイスなど)のルートディレクトリを示します。この下にそのファイルシステム専用のゴミ箱が作成されます。
  • $trash: 個々のゴミ箱ディレクトリのルートパスを示します。例えば $HOME/.local/share/Trash$topdir/.Trash-$uid などです。
  • $uid: ユーザーID (User ID) を示します。共有ゴミ箱内でユーザー固有のディレクトリを作成する際などに使用されます。

主要機能

  1. 移動 (ゴミ箱へ)
    • 対象: 同一ファイルシステム上のファイルやディレクトリを $trash へ移動させます。異なるファイルシステム間の移動は行いません。
    • ゴミ箱の管理: 適切なパーミッションでゴミ箱が存在しない場合は自動的に作成します。
    • 重複回避: ゴミ箱に同名のアイテムが存在する場合、重複を回避するための仕組みが組み込まれています。
    • 情報ファイルの作成: 移動したアイテムに対応する .trashinfo ファイルを $trash/info/ ディレクトリ内に作成し、元のパスと削除日時を記録します。
  2. 削除 (ゴミ箱から)
    • 対象: 全てのファイルシステムに存在するゴミ箱のアイテム(各 $trash/files 内のデータと各 $trash/info 内の .trashinfo ファイル)を完全に削除します。
    • ゴミ箱の再作成: 削除後、各ゴミ箱には $trash/files および $trash/info ディレクトリが適切に再作成されます。
    • 確認機能: アイテムの削除前に確認プロンプトを表示するか、または確認なしで実行するかを選択できます。
  3. リスト表示
    • 対象: 全てのファイルシステムに存在するゴミ箱の内容を一覧表示します。
    • 表示形式: ls コマンドに相当する単純なリスト表示と、ls -l コマンドに相当する詳細なリスト表示の両方に対応しています。
    • カスタマイズ: ファイルタイプに基づく色付け表示が可能で、この色付けを無効にすることもできます。
  4. リストア (復元)
    • 対象: ゴミ箱内のアイテムを元の場所へ復元します。
    • 上書きの禁止: ゴミ箱からファイルを復元する際、復元先のディレクトリに同名のアイテムが既に存在する場合、上書きは行われず、エラーが表示されます。
    • 復元元情報: .trashinfo ファイルに記録された情報に基づき、元のパスへ正確にアイテムを戻します。
    • インタラクティブ選択: 復元するアイテムのインタラクティブな選択ができます。

Freedesktop.org ゴミ箱仕様に基づく実装詳細

本プログラムは、Freedesktop.org のゴミ箱仕様に厳密に基づいて以下の点を考慮して実装されています。

  • ゴミ箱の健全性確認: ゴミ箱ディレクトリがシンボリックリンクではないことを確認します。

  • 不正な移動の禁止: ゴミ箱そのもの、またはゴミ箱内のアイテムをさらにゴミ箱へ移動させる操作は禁止されています。

  • ゴミ箱の配置と取得優先順位:

    • ユーザーごとの主要なゴミ箱は、環境変数 $XDG_DATA_HOME/Trash を優先し、存在しない場合は $HOME/.local/share/Trash を使用します。これらは必要に応じて自動的に作成されます。
    • $topdir(例えば //mnt/usb)にあるゴミ箱は、$topdir/.Trash または $topdir/.Trash-$uid の形式で管理されます。
      • $topdir/.Trash が管理者によって既に作成されている場合、その中にユーザー固有の $topdir/.Trash/$uid を作成・使用します。
      • $topdir/.Trash が存在しない場合は、ユーザー専用の $topdir/.Trash-$uid を作成・使用します。
    • 異なるファイルシステム上のアイテムは、そのファイルシステムがマウントされている $topdir 内のゴミ箱へ移動する。ただし、Freedesktop.org の仕様では異なるファイルシステム間でのファイルコピーによるゴミ箱への移動は任意とされているが、本プログラムではパフォーマンスコストを考慮し、異なるファイルシステムを横断する(コピーを伴う)ゴミ箱への移動はサポートしない。
  • ゴミ箱のパーミッション:

    • ユーザーごとのゴミ箱 ($XDG_DATA_HOME/Trash または $HOME/.local/share/Trash) は 700 で作成されます。
    • 共有ゴミ箱 ($topdir/.Trash) は 1777 のパーミッション(スティッキービット設定)であるべきです。
    • ユーザー専用ゴミ箱 ($topdir/.Trash/$uid および $topdir/.Trash-$uid) は原則 700 で作成しますが、それができない場合は 1777 で作成されます。

    Freedesktop.org の仕様では、topdir/.Trash/uid や topdir/.Trashuid のパーミッションに関する明確な指示は 700 でなければならないとは書いていません。しかし、$topdir/.Trash にスティッキービットが設定されている理由として、その中に作成されるサブディレクトリ(つまり topdir/.Trash/uid)が他のユーザーによって削除されないようにするため、という意図があることから、ユーザーが自分自身のゴミ箱に対してはフルコントロールを持つ 700 が妥当と解釈できます。パーミッション 700 で作成できない場合の堅牢性確保のために 1777 で代替します。これは仕様には明記されていないが、他のアプリケーションの挙動を鑑みた独自の実装判断です。

  • ゴミ箱ディレクトリの構造:$trash ディレクトリは以下の2つのサブディレクトリで構成されます。

    • $trash/files:
      • 実際にゴミ箱に入れられたファイルやディレクトリがここに格納されます。
      • ファイル名はゴミ箱内で一意になるようプログラムが決定し、元のファイル名には依存しません。
      • 元のファイルのアクセス権限、アクセス時間、変更時間、および拡張属性は保持されます。
    • $trash/info:
      • $trash/files 内の各アイテムに対応する情報ファイルが格納されます。
      • 情報ファイルのファイル名は、対応する files 内のファイル名に .trashinfo 拡張子が付加されたものです。
      • .trashinfo ファイルは、Desktop Entry Specification に類似したテキスト形式で、以下の情報を持ちます。
        • [Trash Info]:ファイルの最初の行。
        • Path=:ファイルがゴミ箱に入れられる前の元の絶対パス(RFC 2396/3986 形式でURLエスケープされた文字列)。
        • DeletionDate=:ファイルがゴミ箱に入れられた日時(RFC 3339 形式 YYYY-MM-DDThh:mm:ss)。
  • directorysizes キャッシュ: v1.0に準拠した実装を目指す場合、以前の仕様バージョンと比較すると directorysizes キャッシュが最も重要な変更であることは理解しています。「SHOULD」とされており、「MUST」ではありません。これは、実装が推奨されるものの、仕様の必須要件ではないことを意味します。そのため、コードの複雑化の回避やパフォーマンス最適化のための directorysizes キャッシュ機能については、現時点では実装を見送ります。(面倒くさそうなので実装しない言い訳です)

ライセンス

ライセンスは MIT です。フィードバックお願いします。



コメント