표적

표적

표적

디스크 번호를 읽고 마운트 명령을 실행할 수 있는 간단한 단일 라이너는 무엇입니까?

한 줄의 코드로 다음과 같은 작업이 실행됩니다.

./mountEFI.command disk3 

배경

user@mac ~ % diskutil 목록

반품

/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *128.0 GB   disk0
   1:                        EFI ⁨NO NAME⁩                 104.9 MB   disk0s1
   2:         Microsoft Reserved ⁨⁩                        16.8 MB    disk0s2
   3:       Microsoft Basic Data ⁨NTFS⁩                    127.4 GB   disk0s3
   4:           Windows Recovery ⁨⁩                        525.3 MB   disk0s4

/dev/disk1 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *1.0 TB     disk1
   1:                        EFI ⁨EFI⁩                     209.7 MB   disk1s1
   2:                 Apple_APFS ⁨Container disk2⁩         1000.0 GB  disk1s2

/dev/disk2 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +1000.0 GB  disk2
                                 Physical Store disk1s2
   1:                APFS Volume ⁨LANCE - Data⁩            60.7 GB    disk2s1
   2:                APFS Volume ⁨LANCE⁩                   15.3 GB    disk2s3
   3:              APFS Snapshot ⁨com.apple.os.update-...⁩ 15.3 GB    disk2s3s1
   4:                APFS Volume ⁨Preboot⁩                 309.8 MB   disk2s4
   5:                APFS Volume ⁨Recovery⁩                620.4 MB   disk2s5
   6:                APFS Volume ⁨VM⁩                      1.1 MB     disk2s6

/dev/disk3 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *61.5 GB    disk3
   1:                        EFI ⁨EFI_USB⁩                 209.7 MB   disk3s1
   2:                  Apple_HFS ⁨Install macOS Monterey⁩  61.2 GB    disk3s2

그래서:

diskutil list | grep '(external, physical)'

반품

/dev/disk3 (external, physical):
     ^   ^
     6   10

목표는 문자 6-10을 반환하는 것입니다.디스크 3.

한 줄의 코드는 다음과 동등한 작업을 수행해야 합니다.

./mountEFI.command disk3 

디스크 번호를 읽고 마운트 명령을 실행할 수 있는 간단한 단일 라이너는 무엇입니까?

고쳐 쓰다

diskutil list -plist external physical

반품

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>AllDisks</key>
    <array>
        <string>disk3</string>
        <string>disk3s1</string>
        <string>disk3s2</string>
    </array>
    <key>AllDisksAndPartitions</key>
    <array>
        <dict>
            <key>Content</key>
            <string>GUID_partition_scheme</string>
            <key>DeviceIdentifier</key>
            <string>disk3</string>
            <key>OSInternal</key>
            <false/>
            <key>Partitions</key>
            <array>
                <dict>
                    <key>Content</key>
                    <string>EFI</string>
                    <key>DeviceIdentifier</key>
                    <string>disk3s1</string>
                    <key>DiskUUID</key>
                    <string>5F5C5E00-71B1-4259-B062-95683183898B</string>
                    <key>Size</key>
                    <integer>209715200</integer>
                    <key>VolumeName</key>
                    <string>EFI_USB</string>
                    <key>VolumeUUID</key>
                    <string>0E239BC6-F960-3107-89CF-1C97F78BB46B</string>
                </dict>
                <dict>
                    <key>Content</key>
                    <string>Apple_HFS</string>
                    <key>DeviceIdentifier</key>
                    <string>disk3s2</string>
                    <key>DiskUUID</key>
                    <string>059700E8-2B72-4669-9030-7C783AA398FB</string>
                    <key>MountPoint</key>
                    <string>/Volumes/Install macOS Monterey</string>
                    <key>Size</key>
                    <integer>61186465792</integer>
                    <key>VolumeName</key>
                    <string>Install macOS Monterey</string>
                    <key>VolumeUUID</key>
                    <string>14B0CA5F-27B4-31E3-8096-9235338AFBBD</string>
                </dict>
            </array>
            <key>Size</key>
            <integer>61530439680</integer>
        </dict>
    </array>
    <key>VolumesFromDisks</key>
    <array>
        <string>Install macOS Monterey</string>
    </array>
    <key>WholeDisks</key>
    <array>
        <string>disk3</string>
    </array>
</dict>
</plist>

답변1

"/dev/"and more 사이의 부분을 원하는 것처럼 들리 " (external, physical):"므로 다음과 같습니다.

diskutil list | sed -n 's|^/dev/\(.*\) (external, physical)$|\1|p'

cut일부 입력의 각 줄에서 일정 범위의 바이트를 반환할 수 있지만 해당 입력은 매개 변수가 아닌 표준 입력을 통해 전달되어야 합니다.

diskutil list | grep '(external, physical)' | cut -b 6-10

disk10그러나 이 방법은 이름이 이 패턴을 따르지 않는 위의 장치 또는 블록 장치에 대해서는 실패합니다.

앞 공백을 제거한 각 줄(아포스트로피, 큰따옴표 또는 백슬래시가 포함되어 있지 않다고 가정)을 ./mountEFI.commandusing 에 대한 별도 호출에 대한 인수 로 전달할 수 있습니다 xargs.

diskutil list |
  sed -n 's|^/dev/\(.*\) (external, physical)$|\1|p' |
  xargs -I DISK ./mountEFI.command DISK

답변2

나는 awk를 사용할 것이다:

(Mac이 없기 때문에 awk에 대한 입력으로 샘플 출력이 포함된 텍스트 파일을 사용했습니다. awk와 동일한 방식으로 작동합니다 diskutil list | awk ...)

$ awk -F'[/ ]' '/external, physical/ { print $3 }' /tmp/diskutil.list 
disk3

및 (공백)을 필드 구분 기호로 사용하면 이 awk 스크립트는 /"external,physical" 과 일치하는 모든 줄의 세 번째 필드( )만 인쇄합니다 . $3일치하지 않는 입력 행을 인쇄하지 마십시오.

첫 번째 필드는 첫 번째 이전의 빈 문자열이고 /, 두 번째 필드는 첫 번째와 두 번째 /( dev) 사이의 모든 항목이며, 세 번째 필드는 두 번째 /와 첫 번째 공백 문자( disk3) 사이의 모든 항목입니다.


./mountEFI.command디스크별로 수행하려면 다음을 사용할 수 있습니다 xargs.

diskutil list awk -F'[/ ]' '/external, physical/ { print $3 }' | xargs -L 1 ./mountEFI.command

-L 1xargs에게 실행하라고 지시./mountEFI.command 한 줄에 한 번씩awk에 둘 이상의 출력 라인이 있는 경우.

그렇지 않은 경우 -L 1명령 xargs을 한 번 실행하려고 시도합니다(또는 시스템의 ARG_MAX에 따라 수천 줄이 있는 경우 가능한 한 적은 횟수... Mac에서는 무엇인지 모르지만 Linux에서는 약 200입니다.) 백만 자이므로 "많은") 가능한 한 많은 인수를 사용하여(예: xargs는 disk0 및 disk1이 패턴과 일치하면 실행됨) ./mountEFI.command disk0 disk1여러 인수를 반복할 수 없으면 작동하지 않습니다../mountEFI.command

관련 정보