Ubuntu Weekly Recipe

第640回gioコマンドを使ってコマンドラインからリモートのファイルを制御する

今回は一連のgvfsコマンドに代わって、gioコマンドを使用する方法を紹介します。

Ubuntu 20.10リリースとその変更点

既報のとおり10月22日にUbuntu 20.10がリリースされました。今回のリリースはあまり大きな変更点はありません。

Ubuntu 20.10ではカーネルのバージョンが5.8になってAMD Ryzen PRO 4000Gシリーズに対応[1]⁠、メモリ4/8GBのRaspberry Pi (4)で動作するUbuntu(デスクトップ)インストールイメージがリリースされたなどが特徴でしょうか。前者はさておき、後者に関してはまたいずれ別の機会に紹介しようと思います。

地味な変更点としては、gvfs-binパッケージがインストールされなくなりました。このパッケージにはgvfs-openやgvfs-mountといったgvfs関連コマンドが収録されていました。もちろんリポジトリから削除されたわけではないため別途インストールできますが、現在ではlibglib2.0-binパッケージに含まれるgioコマンドが推奨のようです。gvfs関連パッケージはそれぞれ独立したコマンドが収録されていますが、gioコマンドは一つでオプションでさまざまな機能を使い分けます。ちょうどapt-getやapt-cacheコマンドとaptコマンドのような感じであると理解すれば早いかもしれません。

というわけで、今回はgioコマンドについて紹介します。

gvfsとは

そもそもgvfsGVfsとは何なのでしょうか。簡単にいえばローカルとリモートを問わずさまざまなプロトコルで透過的にアクセスするためのしくみです。UbuntuというかGNOMEデスクトップ環境のファイルマネージャーである「ファイル」⁠旧名Nautilus)はもちろん、XubuntuというかXfceのファイルマネージャーであるThunar、Ubuntu MATEというかMATEデスクトップ環境のファイルマネージャーであるCaja、Cinnamonデスクトップ環境のファイルマネージャーであるNemoなど、多くのファイルマネージャーでサポートされています。

LAN内にNASなどがある場合、⁠ファイル」を起動して「他の場所」をクリックすると「ネットワーク」以下に表示されますが、これはgvfsを使用しています。また「サーバーへ接続」「?」アイコンをクリックするとバルーンヘルプが表示されますが、これもgvfsでアクセスできるプロトコルの例です。

gvfs-binパッケージに収録されている各種コマンドやgioコマンドはこのgvfsのコマンドラインフロントエンドですが、ほかにも機能があります。

今回、実際に検証を行っているのはUbuntu 20.10ですが、20.04 LTSでも同様に使用できます。

gioコマンドの使い方

マウントを操作する

では本題に入ります。何はなくともまずはマウントするところから始めます。gioコマンドを使って現在のマウント状況を確認しましょう。

$ gio mount -l

通常は「Drive(数値)」がいくつか表示されるだけでしょう。もしマウント済みの領域があれば「Mount(数値)」が表示されます。また「Volume(数値)」というのもあるようです。

実際にマウントする場合はパスを引数に取ります。

$ gio mount (パス)

具体的には次のようなコマンドを実行します。

$ gio mount -a smb://ds118.local/share/misc/recipe

「-a」「–annonymous」と同等で、すなわちユーザー名もパスワードもなしでログインする場合につけるオプションです。⁠-a」がない場合はログインに必要な情報を対話式で入力します。

アンマウントするには次のコマンドを実行します。

$ gio mount -u (パス)

「-u」「–unmount」です。なおパスは補完されるのでTabキーを押してみましょう。

フォルダの中身を確認する

フォルダーの中身を確認するには次のコマンドを実行します。

$ gio list (パス)

lsコマンドと類似した表示になりますが、ツリー状で表示したい場合はlistの代わりにtreeを指定してください。

ファイルを開く

ファイルを開く場合は次のコマンドを実行します。

$ gio open (パス)

gvfs-binパッケージに含まれるgvfs-openコマンドやxdg-utilsパッケージに含まれるxdg-openコマンドと同様に使用できます。なおUbuntu 20.10においてもxdg-utilsパッケージはあらかじめインストールされているため、そのまま引き続き使用することもできます。

ファイルを操作する

ファイルをコピーする場合は次のコマンドを実行します。

$ gio copy (パス) (パス)

具体例は次のとおりです。

$ gio copy smb://ds118.local/share/misc/recipe/micropc-focal.md .

このように、ファイルの場所がリモートかローカルかを問わず透過的に指定できます。

移動するときはcopyの代わりにmove、ファイル名を変更する場合はcopyの代わりにrenameを指定すると、それぞれのことが行なえます。

すべてではありませんが基本的な使い方は以上のとおりです。以降は応用的な使い方で、原則としてローカルのファイルシステムのみで有効です。

ファイルやフォルダーをゴミ箱に入れる場合は次のコマンドを実行します。

$ gio trash (パス)

ゴミ箱を空にする場合は次にコマンドを実行します。

$ gio trash --empty

コマンドからゴミ箱を制御するには、trash-cliパッケージに含まれているコマンドが便利です。gio trashコマンドではできないゴミ箱からファイルを戻すことなどができます。

デスクトップにアプリケーションの起動アイコンをコピーしてもそのまま実行できるようにはならず、右クリックして「起動を許可する」をクリックする必要があります。これをコマンドラインから行うこともできます。次のコマンドを実行してください。

$ cd ~/デスクトップ
$ gio copy /usr/share/applications/firefox.desktop .
$ gio set firefox.desktop "metadata::trusted" true
$ chmod +x firefox.desktop

無駄にgio copyコマンドを使用していますが、もちろんcpコマンドでも構いません。

gio setコマンドでファイルの属性を変更した後に実行権限を与えています。検証した限りでは順序が逆では動作しませんでした。

なおファイルの属性を表示するには次のコマンドを実行します。

$ gio info firefox.desktop

フォルダやファイルを監視する

ファイルやフォルダーの状態を監視することもできます。具体例を見ていきましょう。

$ gio monitor ~/ドキュメント

監視したフォルダーにtouchコマンドでファイルを作ると、次のように表示されます。

/home/ikuya/ドキュメント: /home/ikuya/ドキュメント/newfile: created
/home/ikuya/ドキュメント: /home/ikuya/ドキュメント/newfile: changes done
/home/ikuya/ドキュメント: /home/ikuya/ドキュメント/newfile: attributes changed

ただ、率直なところどう使えばいいのかよくわかりません。特定の変更があった場合に何かをフックするといった使い方は想定されていないようで、変更したことを眺める以外の使い方が思いつきません。もちろんそれも場合によっては有効な使いみちではあるのですが。

端末への出力結果を保存する

端末への出力を保存することもできます。こちらも具体例を示します。

$ gio list |gio save ls.txt

これでカレントフォルダーの内容をls.txtに保存できます。リダイレクトやteeコマンドでも同様のことができますが、マウント先にも保存できるのが目新しいところです。次の例を見てください。

$ gio list |gio save smb://ds118.local/share/misc/recipe/ls.txt

このようにgioコマンドはとても便利です。紹介しきれなかった機能もありますが、問題はgitコマンドと似ていて本記事の執筆中でも数回入力を誤ってしまったことでしょうか。

おすすめ記事

記事・ニュース一覧