/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"
등
답변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
다음 주어진 각 인수를 쉘 패턴으로 각 마운트 지점과 비교합니다. 각 일치 항목에 대해 패턴 일치 및 마운트 지점이 인쇄되고 다음 마운트 지점이 고려됩니다. 출력 형식은 명령을 변경하여 쉽게 변경할 수 있습니다 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