如何列出以给定前缀/根开头的所有安装

如何列出以给定前缀/根开头的所有安装

我试图查看/proc/mounts并返回以某个前缀或基本目录开头的所有安装,例如。/run/media。目前,一个前缀就可以了,但原则上,如果能够指定多个前缀就更好了。

grep -o /run/media /proc/mounts仅返回/run/media当前次数。如果正则表达式部分是/run/media[\S]*(尝试匹配完整路径直到空格),它仍然返回与以前相同的结果。

最终我想输出所有使用文本前缀和引号格式化的匹配项,如下所示:

"fs:/run/media/user/device1" "fs:/run/media/user/device2"ETC

答案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函数解析出第二列(安装点),/proc/mounts然后继续将每个给定参数作为 shell 模式与每个安装点进行比较。对于每个匹配,都会打印模式匹配和安装点,并考虑下一个安装点。通过更改命令可以轻松更改输出格式printf

在我有权访问的 Ubuntu 系统上运行的示例(请注意,这些模式是文件名通配模式,并且包含通配字符的模式需要通过引用来保护免受 shell 影响)。

$ 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

我选择在函数中使用 shell 循环来读取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

相关内容