指定されたプレフィックス/ルートで始まるすべてのインストールを一覧表示する方法

指定されたプレフィックス/ルートで始まるすべてのインストールを一覧表示する方法

/proc/mounts特定のプレフィックスまたはデフォルトのディレクトリで始まるすべてのインストールを表示して返したいと思います。/run/media。現時点では1つのプレフィックスで十分ですが、原則として複数のプレフィックスを指定できる方が良いでしょう。

grep -o /run/media /proc/mounts/run/media現在の数だけが返されます。正規表現部分が次の場合/run/media[\S]*(フルパスを空白まで一致させてください)、まだ以前と同じ結果を返します。

最終的には、次のようにテキストプレフィックスと引用符でフォーマットされたすべての一致を出力したいと思います。

"fs:/run/media/user/device1" "fs:/run/media/user/device2"など

答え1

foo () {
    awk '{ print $2 }' /proc/mounts |
    while read -r mountpoint; do
        for pattern do
            if [[ $mountpoint == $pattern ]]; then
                printf '%s:\t%s\n' "$pattern" "$mountpoint"
                break
            fi
        done
    done
}

このbash関数は2番目の列(マウントポイント)を解析し、/proc/mounts与えられた各引数をシェルパターンで各マウントポイントと比較します。各マッチングについて、パターンマッチングとマウントポイントが印刷され、次のマウントポイントが考慮されます。出力形式はコマンドを変更することで簡単に変更できますprintf

アクセス権を持つUbuntuシステムで実行される例(これらのパターンはファイル名のグロービングパターンであり、ワイルドカード文字を含むパターンは引用によってシェルから保護する必要があります)。

$ foo /sys '/sys/*' '*info*'
/sys:   /sys
/sys/*: /sys/firmware/efi/efivars
/sys/*: /sys/fs/fuse/connections
/sys/*: /sys/fs/pstore
/sys/*: /sys/kernel/debug
/sys/*: /sys/kernel/debug/tracing
/sys/*: /sys/kernel/security
*info*: /proc/cpuinfo
*info*: /proc/meminfo
/sys/*: /sys/fs/cgroup
/sys/*: /sys/fs/cgroup/systemd
/sys/*: /sys/fs/cgroup/perf_event
/sys/*: /sys/fs/cgroup/cpu,cpuacct
/sys/*: /sys/fs/cgroup/hugetlb
/sys/*: /sys/fs/cgroup/freezer
/sys/*: /sys/fs/cgroup/blkio
/sys/*: /sys/fs/cgroup/cpuset
/sys/*: /sys/fs/cgroup/pids
/sys/*: /sys/fs/cgroup/net_cls,net_prio
/sys/*: /sys/fs/cgroup/memory
/sys/*: /sys/fs/cgroup/devices

awk私はプログラム自体内でマッチングを実行するのではなくawk(通常実行する)プログラムの出力を読み取るために関数内でシェルループを使用することにしました。パターンを繰り返して==これをbash

ただし、拡張正規表現を使用するには、==関数のをに変更します=~。ただし、式を一致するように^固定する必要があることを覚えておいてください。$特定パス(のように^/sys$)、そうでない場合、式はパス名のどこにでも一致します。

答え2

これがあなたの選択肢です。これで、実力を積み始めた段階ですが、awkここに示されている使い方を改善する方法についてのフィードバックを提供していただきありがとうございます。

show_mount_prefix() {

# $1 is a directory prefix.  Display all current mounts that have that prefix.

  printf '"%s" ' $(mount | awk -v prefix=" on ${1}[/ ]" '$0~prefix {print $3}')
  printf '\n'
}

引数なしでshow_mount_prefix()すべてのマウントポイントを表示します。 [読みやすくするために改行を追加]:

$ show_mount_prefix 
"/sys" "/proc" "/dev" "/dev/pts" "/run" "/" "/sys/kernel/security" 
"/dev/shm" "/run/lock" "/sys/fs/cgroup" "/sys/fs/cgroup/unified" 
"/sys/fs/cgroup/systemd" "/sys/fs/pstore" "/sys/fs/cgroup/perf_event" 
"/sys/fs/cgroup/memory" "/sys/fs/cgroup/cpu,cpuacct" "/sys/fs/cgroup/pids" 
"/sys/fs/cgroup/devices" "/sys/fs/cgroup/freezer" "/sys/fs/cgroup/blkio" 
"/sys/fs/cgroup/rdma" "/sys/fs/cgroup/cpuset" "/sys/fs/cgroup/net_cls,net_prio" 
"/sys/fs/cgroup/hugetlb" "/dev/mqueue" "/sys/kernel/debug" 
"/proc/sys/fs/binfmt_misc" "/dev/hugepages" "/sys/kernel/debug/tracing" 
"/sys/fs/fuse/connections" "/sys/kernel/config" "/snap/core/7270" 
"/snap/core/7396" "/data" "/var/lib/lxcfs" "/run/user/370880" "/run/user/0"

次のような主張があります。

$ show_mount_prefix /dev
"/dev" "/dev/pts" "/dev/shm" "/dev/mqueue" "/dev/hugepages" 

残念ながら、アルゴリズムは、/引数がない場合など、すべてのインストールを一覧表示できる引数を直感的に処理しません。以前はこれが本当でしたが、パターン[/ ]に原子を追加するとawk壊れます。 OPが/d一致したくない場合などを考慮すると、/devこの原子が必要です。/data

関連情報