質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Q&A

解決済

2回答

3796閲覧

ubuntuのUSBメモリーの絶対パスの取得方法

mie0224

総合スコア34

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

0グッド

0クリップ

投稿2020/04/28 12:32

調べてみたのですが、答えが見つかりませんでしたので質問させてくださいm(_ _)m

###ubntuにてUSBメモリーを挿し込んだ時、その絶対パスを取得したいです。
条件は

◎USBメモリーを差し込む場所はいつも同じ場所で
◎USBメモリーは、いろんなメーカーのUSBメモリーを差し込む
◎流動的な絶対パスを取得したい

たとえば、TOSHIBA製のUSBメモリーを挿し込んだ時は、「/media/ユーザー名/TOSHIBA」でパスがヒットしますが、プログラムの変数でパスを持ちたいので、ここでpanasonic製のUSBメモリーを挿し込むと、パスを見失ってしまいます。USBメモリーを挿し込む場所はいつも同じなので、ここで挿し込まれたUSBの絶対パス(流動的な「media/ユーザー名/」以下の名前」でもいいです)を取得する方法が知りたいです。

どなたかご存知ないでしょうか?
よろしくお願いいたしますm(_ _)m

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

GIOライブラリのGVolumeMonitorで、ある程度の事はできるのではないでしょうか。

そもそも「USBメモリ」の判別は難しいと思います。
(おそらくDVDやUSBハードディスクも引っかかってしまうけど)「エジェクトできるか」で判断するとかで妥協するとか。

「プログラム」としか書かれてなく何の言語化はわかりませんが、GIOライブラリはGObjectIntrospectionに対応しているので、大抵の言語でも使えると思います。

例えば、C言語なら。

c

1#include <gio/gio.h> 2#include <stdio.h> 3 4int main() 5{ 6 GVolumeMonitor *mon; 7 GList *mounts; 8 GList *l; 9 char *mount_name; 10 GFile *root; 11 char *root_path; 12 13 mon = g_volume_monitor_get(); 14 mounts = g_volume_monitor_get_mounts(mon); 15 16 for (l = mounts; l != NULL; l = l->next) { 17 mount_name = g_mount_get_name(G_MOUNT(l->data)); 18 root = g_mount_get_root(G_MOUNT(l->data)); 19 root_path = g_file_get_path(root); 20 printf("%s, %s, %s.\n", mount_name, g_mount_can_eject(G_MOUNT(l->data))? "ejectable": "unejectable", root_path); 21 g_free(root_path); 22 g_object_unref(root); 23 g_free(mount_name); 24 } 25 26 g_list_free_full(mounts, (GDestroyNotify)g_object_unref); 27 g_object_unref(G_OBJECT(mon)); 28 29 return 0; 30} 31

Pythonなら。

python

1# coding: utf-8 2 3from gi.repository import Gio 4 5mon = Gio.VolumeMonitor.get() 6for m in mon.get_mounts(): 7 d = m.get_drive() 8 print('%s, %s, %s(%s).' % (repr(m.get_name()), repr(m.get_root().get_path()), repr(d.get_name() if d is not None else '(none)'), repr(m.can_eject()))) 9

と書いてから、「USBメモリーを差し込む場所はいつも同じ場所で」という点に気づきました。
指す場所が一緒ならば、Unixのデバイス名も一緒なのでは?(ちょっと自信ない)
とりあえずGIOでデバイス名も取ってみました。(Cで書くのは面倒なので、Pythonで)

python

1# coding: utf-8 2 3from gi.repository import Gio 4 5mon = Gio.VolumeMonitor.get() 6for m in mon.get_mounts(): 7 d = m.get_drive() 8 vol = m.get_volume() 9 device_path = vol.get_identifier('unix-device') 10 print('%s, %s, %s(%s), %s.' % (repr(m.get_name()), repr(m.get_root().get_path()), repr(d.get_name() if d is not None else '(none)'), repr(m.can_eject()), repr(device_path))) 11

投稿2020/04/28 16:04

編集2020/04/28 16:06
katsuko

総合スコア3538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mie0224

2020/04/30 04:05

katsuko 様 ありがとうございます! プログラミング言語書いておけばよかったです(><) 実はNode.jsなんです。 今、適当ですが「GVolumeMonitor Node.js」とググったらヒットしないっぽいです(;;) Cで書いてDLLとかでパイプできるかな・・・Pythonの方は経験がなくて、ちょっとNode.jsのレイヤーに持ってこれないかトライしてみますm(_ _)m
guest

0

ベストアンサー

原始的な方法ですが、わたしのラズパイ(ubuntu)ではよくシェルスクリプトなどで

$ mount -l | grep media

と実行すると

/dev/sda1 on /media/pi/2011-0BF6 type vfat ..... 以下省略

みたいにマウント情報が得られるのでcutコマンドで

$ mount -l | grep media | cut -f3,3 -d' '
/media/pi/2011-0BF6

と実行してUSBメモリのマウントポイント(/media/pi/2011-0BF6)を取り出したりしています。
もっとスマートな方法があると思いますが参考にしてください。

投稿2020/04/28 12:58

technocore

総合スコア7337

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mie0224

2020/04/30 07:25

technocore 様 ありがとうございます! 教えていただいた方法で取れました! この方法で一旦やってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問