주어진 접두사/루트로 시작하는 모든 설치를 나열하는 방법

주어진 접두사/루트로 시작하는 모든 설치를 나열하는 방법

/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

관련 정보