タグ付けしたファイルをGUIで再帰的検索する方法

はじめに

Ubuntu 22.04では様々なファイルマネージャーをインストールできます。
これらファイルマネージャー毎に異なる利点があることから、わたしはいくつかのファイルマネージャーを同時に使用しています。^1

そしてこれらはファイルにタグ付けできます。それらは

  • Nautilus:スター
  • Thunar:シンボル(エンブレム)

と呼ばれています。
これらを使った再帰的な検索表示はできないものでしょうか?

結論から書くと、Nautilusではスターのついたファイルを検索できません。(一覧表示でスターを表示させるように設定すると、そのフォルダの並び順をスターがついているものを先頭にするような事はできますが、再帰的に検索はできません(わたしには無理))

対してThunarではシンボルをつけたファイルの再帰的な検索が可能です。

ここでは背景情報とともに記事として共有します。

環境

inxi -Sxxx --filter
System:
  Kernel: 6.5.0-45-generic x86_64 bits: 64 compiler: N/A Desktop: Unity
    wm: gnome-shell dm: GDM3 42.0 Distro: Ubuntu 22.04.4 LTS (Jammy Jellyfish)

拡張属性

拡張属性(xattr)は、ファイルシステムでサポートされるメタデータを扱う仕組みです。これらは通常のファイルデータとは別に、ファイルに追加情報を付加するために利用されています。

例えばmimeタイプやスターによるタグ付けなどです。

Linuxで使用されるファイルマネージャーでは、様々な拡張属性を利用した便利機能がたくさんあります。これら便利機能を支える仕組みはXDGのように汎用性の高いものからGVfsのようにデスクトップ環境によるものまで様々です。^3

今回はファイルにタグ付けする機能、たとえばNautilusのスターとかThunarのシンボルについて扱います。例えば以下のようなものです。

  1. Nautilusでのスター
    アイコン表示

    一覧表示
  2. Thunarでのシンボル

わたしはこのようなタグ付けをあまり利用していなかったのですが、ファイルの位置(パス)を移動してもこのタグ付けが消えないことに気づき、これは便利だな、と思いました。どうやらinodeを利用しているためのようです。

これらスターやシンボルをつけたファイルだけを再帰的に、ファイルマネージャーで表示させるような機能があったら便利ですよね?

ただ現状ではNautilusThunarの両者ともこのような検索機能は実装されていません。

拡張属性へのアクセス方法

無い機能は作る、で下調べしてみました。
これらの拡張属性にアクセスする方法がなければどうにもなりません。

まずNautilusのスターについて調査します。

いくつか調べてみましたが、gioコマンドやxattrコマンド、あるいはattrユーティリティで得られるコマンド(getfattrコマンドなど)ではスター(Nautilus)についてのメタデータにアクセスできません。

gvfs-infoコマンドでアクセスできるとの記述を見つけましたが、Ubuntu 22.04のリポジトリには存在しませんでした。gvfs-metadataコマンドも存在しません。(universe, multiverse含む)

NautilusにおけるスターのデータはGVFSによってmetadata::emblems名前空間に格納、それらのデータは~/.local/share/gvfs-metadata/ディレクトリ以下にバイナリファイルとして保存されています。

参考:

Nautilusではディレクトリに多数のファイルが存在する場合、他のファイルマネージャーと比較してかなり動作が重くなりますが、この原因がメタデータ(拡張属性)の処理によるものなのかもしれないな…と思いました。

参考:

tracker3コマンドを用いて調べることができる、という情報があったので、tracker-test-utilsコマンドをインストールしてtracker3コマンドを利用可能にしました。

tracker3 info star.pngとすると、後述するgio info star.pngと同じように詳細な情報を得ることができます。

しかしこの中に「スターがついているかどうか」を表す情報は含まれていませんでした。

user@user:~/ドキュメント/file_metadata/assets$ tracker3 info star.png | xsel
Querying information for entity: 'star.png'
  'file:///home/user/%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88/file_metadata/assets/star.png'
Results:
  'tracker:extractorHash' = '***********************'
  'nfo:fileLastModified' = '2024-08-13T04:09:42Z'
  'nfo:fileName' = 'star.png'
  'nfo:fileSize' = '300323'
  'nfo:belongsToContainer' = 'urn:fileid:03d690db-6073-4ac2-a67d-d90c69aab9a7:35270024'
  'nfo:fileCreated' = '2024-08-13T04:09:42Z'
  'nfo:fileLastAccessed' = '2024-08-13T04:09:42Z'
  'nie:isPartOf' = 'urn:fileid:03d690db-6073-4ac2-a67d-d90c69aab9a7:6433807'
  'nie:isPartOf' = 'urn:fileid:03d690db-6073-4ac2-a67d-d90c69aab9a7:35270017'
  'nie:isPartOf' = 'urn:fileid:03d690db-6073-4ac2-a67d-d90c69aab9a7:35270024'
  'nie:created' = '2024-08-13T04:09:42Z'
  'nie:interpretedAs' = 'urn:fileid:03d690db-6073-4ac2-a67d-d90c69aab9a7:6459418'
  'nie:dataSource' = 'urn:fileid:03d690db-6073-4ac2-a67d-d90c69aab9a7:5767264'
  'nie:byteSize' = '300323'
  'nie:url' = 'file:///home/user/%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88/file_metadata/assets/star.png'
  'http://purl.org/dc/elements/1.1/source' = 'urn:fileid:03d690db-6073-4ac2-a67d-d90c69aab9a7:5767264'
  'http://purl.org/dc/elements/1.1/date' = '2024-08-13T04:09:42Z'
  'nrl:modified' = '54'
  'nrl:added' = '2024-08-13T04:39:12Z'
  'rdf:type' = 'http://www.w3.org/2000/01/rdf-schema#Resource'
  'rdf:type' = 'http://tracker.api.gnome.org/ontology/v3/nie#DataObject'
  'rdf:type' = 'http://tracker.api.gnome.org/ontology/v3/nfo#FileDataObject'
  'nmm:dlnaMime' = 'image/png'
  'nmm:dlnaProfile' = 'PNG_LRG'
  'nfo:width' = '533'
  'nfo:height' = '493'
  'nie:isStoredAs' = 'file:///home/user/%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88/file_metadata/assets/star.png'
  'nie:mimeType' = 'image/png'
  'nrl:modified' = '54'
  'nrl:added' = '2024-08-13T04:09:43Z'
  'rdf:type' = 'http://www.w3.org/2000/01/rdf-schema#Resource'
  'rdf:type' = 'http://tracker.api.gnome.org/ontology/v3/nie#InformationElement'
  'rdf:type' = 'http://tracker.api.gnome.org/ontology/v3/nfo#Media'
  'rdf:type' = 'http://tracker.api.gnome.org/ontology/v3/nfo#Visual'
  'rdf:type' = 'http://tracker.api.gnome.org/ontology/v3/nfo#Image'
  'rdf:type' = 'http://tracker.api.gnome.org/ontology/v3/nmm#Photo'

tracker3 sparqlを使えば、あるいはスターがつけられているかどうかを検索できるかも知れません。しかしわたしの能力を超えるのでこれ以上は調べませんでした。ですのでNautilusのスターを用いた再帰的検索は諦めることにしました。

参考:

さて、Nautilusのスターに関する属性情報のアクセスのしにくさと対象的に、Thunarにおけるシンボルの属性情報についてはgio infoコマンドで簡単に確認することができます。

user@user:~/ドキュメント/file_metadata/assets$ gio info star.png | xsel

表示名: star.png
編集名: star.png
名前: star.png
種類: regular
サイズ:  300323
URI: file:///home/user/%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88/file_metadata/assets/star.png
ローカルパス: /home/user/ドキュメント/file_metadata/assets/star.png
unix mount: /dev/********** / ext4 rw,relatime,errors=remount-ro
属性:
  standard::type: 1
  standard::name: star.png
  standard::display-name: star.png
  standard::edit-name: star.png
  standard::copy-name: star.png
  standard::icon: image-png, image-x-generic, image-png-symbolic, image-x-generic-symbolic
  standard::content-type: image/png
  standard::fast-content-type: image/png
  standard::size: 300323
  standard::allocated-size: 303104
  standard::symbolic-icon: image-png-symbolic, image-x-generic-symbolic, image-png, image-x-generic
  etag::value: 1723522182:927808
  id::file: l66306:6459418
  id::filesystem: l66306
  access::can-read: TRUE
  access::can-write: TRUE
  access::can-execute: FALSE
  access::can-delete: TRUE
  access::can-trash: TRUE
  access::can-rename: TRUE
  time::modified: 1723522182
  time::modified-usec: 927808
  time::access: 1723523952
  time::access-usec: 666366
  time::changed: 1723523952
  time::changed-usec: 646366
  time::created: 1723522182
  time::created-usec: 815809
  unix::device: 66306
  unix::inode: 6459418
  unix::mode: 33204
  unix::nlink: 1
  unix::uid: 1000
  unix::gid: 1000
  unix::rdev: 0
  unix::block-size: 4096
  unix::blocks: 592
  owner::user: user
  owner::user-real: user
  owner::group: user
  thumbnail::path: /home/user/.cache/thumbnails/large/3f745d67dd3076c941d85afd04133e8d.png
  thumbnail::is-valid: TRUE
  metadata::emblems: [emblem-cool]    # <- これ。

この情報を使って、metadata::emblemsに情報が付与されているファイルを検索することができます。やったネ😃

検索用スクリプト

ディレクトリを再帰的に捜査し、シンボルをつけたファイルが取得できるかどうかのテストのため、以下の簡単なスクリプトを実行してみます。

#!/bin/bash

# 検索を開始するディレクトリを指定
DIRECTORY=${1:-.}

# ディレクトリを再帰的に検索し、metadata::emblemsが設定されているファイルを表示
find "$DIRECTORY" -type f | while read -r file; do
    if gio info -a "metadata::emblems" "$file" | grep -q "metadata::emblems"; then
        echo "$file"
    fi
done

これを実行するとシンボルをつけたファイルを再帰的に捜査しリストを取得できました。

# 使い方
user@user:~/ドキュメント/file_metadata$ ./metadata.sh ./
assets/star.png

Thunarのカスタムアクションとして登録する

先程のシェルスクリプトが実験成功したので、今度はThunarのカスタムアクションに適合するようにスクリプトを改変します。

find_emblem_files_thunar.sh
#!/bin/bash

# 検索するディレクトリ(Thunarから%fとして渡される)
DIRECTORY="$1"

# 一時的なディレクトリを作成して、検索結果を保存
TEMP_DIR=$(mktemp -d)

# シンボルが付けられたファイルを検索し、結果を一時ディレクトリにシンボリックリンクとして保存
find "$DIRECTORY" -type f | while read -r file; do
    if gio info -a "metadata::emblems" "$file" | grep -q "metadata::emblems"; then
        ln -s "$file" "$TEMP_DIR/$(basename "$file")"
    fi
done

# Thunarで検索結果を表示
thunar "$TEMP_DIR"

このようなスクリプトを作成し、これをカスタムアクションに登録します。

  • カスタムアクションに登録
  • カスタムアクションの出現条件を設定
  • 実行結果
    ディレクトリを右クリックして表示されるメニューからカスタムアクションにアクセスできます。
    新しくウィンドウが開き、検索結果が(GUIで)表示されました!

成功です。

注意点

下調べ中に知ったのですが、拡張属性がついたファイルをcpしたりrsyncしたりする場合、デフォルトでは保持されない場合があるようです。

下の表は、ArchWiKiの拡張属性の項から転載したものです。

コマンドデフォルトで保持するか/必要なフラグ
cp--archive / --preserve=all / --preserve=xattr
mvYes^2
tar作成時には --xattrs、展開時には --xattrs-include='*'
bsdtar展開時に -p
rsync-X, --xattrs
cpioNo
gzipNo
paxNo
syncthingsyncXattrs を有効化する必要あり

わたしはrsyncを使ってバックアップをとっていますが、--xattrsオプションをつけなければシンボルの情報が失われてしまうようです。(未検証)

おわりに

スターやシンボル周りの周辺情報が手に入りましたし、結果的に便利機能がひとつふえました。
よろしかったらご参考にしてください。

ありがとうございました。

参考文献