macOS 명령 "diskutil apfs list"의 특정 필드

macOS 명령 "diskutil apfs list"의 특정 필드

이 주제에 대한 의견을 주시면 감사하겠습니다. macOS에 대한 출력이 있습니다(하이 시에라(High Sierra) 파일 시스템: APFS) 주문하다- diskutil apfs list. 샘플 출력은 다음과 같습니다.

+-- Container disk5 1B5FE22B-6F4F-4EB9-8AA3-D326E4E940DF
|   ====================================================
|   APFS Container Reference:     disk5
|   Size (Capacity Ceiling):      250140434432 B (250.1 GB)
|   Minimum Size:                 192333017088 B (192.3 GB)
|   Capacity In Use By Volumes:   186220453888 B (186.2 GB) (74.4% used)
|   Capacity Not Allocated:       63919980544 B (63.9 GB) (25.6% free)
|   |
|   +-< Physical Store disk4s2 E6FF882B-995C-4C60-B164-76923667F8A1
|   |   -----------------------------------------------------------
|   |   APFS Physical Store Disk:   disk4s2
|   |   Size:                       250140434432 B (250.1 GB)
|   |
|   +-> Volume disk5s1 7BB363F8-A658-4B6C-A4B4-778AC782785E
|   |   ---------------------------------------------------
|   |   APFS Volume Disk (Role):   disk5s1 (No specific role)
|   |   Name:                      Macintosh HD (Case-insensitive)
|   |   Mount Point:               Not Mounted
|   |   Capacity Consumed:         181760897024 B (181.8 GB)
|   |   FileVault:                 Yes (Locked)
|   |
|   +-> Volume disk5s2 48A79DA5-1228-4F5A-8851-5178B91D2310
|   |   ---------------------------------------------------
|   |   APFS Volume Disk (Role):   disk5s2 (Preboot)
|   |   Name:                      Preboot (Case-insensitive)
|   |   Mount Point:               Not Mounted
|   |   Capacity Consumed:         66613248 B (66.6 MB)
|   |   FileVault:                 No
|   |
|   +-> Volume disk5s3 D46C3FA0-5B9D-4E13-9327-EEFB483F692E
|   |   ---------------------------------------------------
|   |   APFS Volume Disk (Role):   disk5s3 (Recovery)
|   |   Name:                      Recovery (Case-insensitive)
|   |   Mount Point:               Not Mounted
|   |   Capacity Consumed:         1033371648 B (1.0 GB)
|   |   FileVault:                 No
|   |
|   +-> Volume disk5s4 3E852266-E0C3-48AB-ACAD-D73CEE0134F1
|       ---------------------------------------------------
|       APFS Volume Disk (Role):   disk5s4 (VM)
|       Name:                      VM (Case-insensitive)
|       Mount Point:               Not Mounted
|       Capacity Consumed:         3221250048 B (3.2 GB)
|       FileVault:                 No

내 목표는 다음과 같습니다

  1. 디스크 컨테이너의 GUID 및 fileVault 상태 "예(잠김)"를 출력합니다.
  2. fileVault 상태 "예(잠김)"의 GUID를 변수에 저장합니다.

나는 다음을 생각해 냈습니다.

diskutil apfs list|awk '/[A-Z0-9]{8}-([A-Z0-9]{4}-){3}[A-Z0-9]{12}$|.l/{print}'

산출:

+-- Container disk5 1B5FE22B-6F4F-4EB9-8AA3-D326E4E940DF
|   Size (Capacity Ceiling):      250140434432 B (250.1 GB)
|   Capacity In Use By Volumes:   186220453888 B (186.2 GB) (74.4% used)
|   Capacity Not Allocated:       63919980544 B (63.9 GB) (25.6% free)
|   +-< Physical Store disk4s2 E6FF882B-995C-4C60-B164-76923667F8A1
|   |   APFS Physical Store Disk:   disk4s2
|   +-> Volume disk5s1 7BB363F8-A658-4B6C-A4B4-778AC782785E
|   |   APFS Volume Disk (Role):   disk5s1 (No specific role)
|   |   FileVault:                 Yes (Locked)
|   +-> Volume disk5s2 48A79DA5-1228-4F5A-8851-5178B91D2310
|   |   APFS Volume Disk (Role):   disk5s2 (Preboot)
|   |   FileVault:                 No
|   +-> Volume disk5s3 D46C3FA0-5B9D-4E13-9327-EEFB483F692E
|   |   APFS Volume Disk (Role):   disk5s3 (Recovery)
|   |   FileVault:                 No
|   +-> Volume disk5s4 3E852266-E0C3-48AB-ACAD-D73CEE0134F1
|       APFS Volume Disk (Role):   disk5s4 (VM)
|       FileVault:                 No

코드를 수정/수정하기 위한 모든 입력을 환영합니다 :). 미리 감사드립니다

답변1

함께 가다마크 플롯닉의 조언구조화된 XML 출력 변환

diskutil apfs list -plist

JSON으로 변환하고 jqjq유틸리티는 macOS의 Homebrew에서 사용할 수 있습니다.

plutil일반 파일을 읽어야 하므로 이 작업은 두 단계로 수행해야 합니다.

diskutil apfs list -plist >list.xml
plutil -convert json -o list.json list.xml

생성된 JSON 파일에서 다음을 사용하여 FileVault가 활성화되고 잠겨 있는 모든 볼륨의 APFS 볼륨 UUID를 추출할 수 있습니다.

jq -r '.Containers[].Volumes[] | select(.FileVault == true and .Locked == true) | .APFSVolumeUUID' list.json

"단일" 명령으로 변수에 할당합니다.

locked_uuids=$(
    diskutil apfs list -plist >list.xml
    plutil -convert json -o list.json list.xml
    jq -r '.Containers[].Volumes[] | select(.FileVault == true and .Locked == true) | .APFSVolumeUUID' list.json
    rm -f list.xml list.json
)

위의 명령은 현재 디렉토리의 list.xml두 파일을 모두 덮어쓰고 삭제한다는 점에 유의하십시오. 다음 명령을 사용하여 임시 파일을 생성 list.json할 수 있습니다 .mktemp

locked_uuids=$(
    tmpxml=$(mktemp)
    tmpjson=$(mktemp)
    diskutil apfs list -plist >"$tmpxml"
    plutil -convert json -o "$tmpjson" "$tmpxml"
    jq -r '.Containers[].Volumes[] | select(.FileVault == true and .Locked == true) | .APFSVolumeUUID' "$tmpjson"
    rm -f "$tmpxml" "$tmpjson"
)

그리고 편의상 이러한 명령을 셸 함수에 넣고 호출할 수도 있습니다( bash여기서 사용됨).

list_locked_vaults () {
    local tmpxml=$(mktemp)
    local tmpjson=$(mktemp)
    diskutil apfs list -plist >"$tmpxml"
    plutil -convert json -o "$tmpjson" "$tmpxml"
    jq -r '.Containers[].Volumes[] | select(.FileVault == true and .Locked == true) | .APFSVolumeUUID' "$tmpjson"
    rm -f "$tmpxml" "$tmpjson"
}

locked_uuids=$( list_locked_vaults )

관련 정보