macOS에 설치된 USB 외부 드라이브에서 bash 스크립트로 배열 생성

macOS에 설치된 USB 외부 드라이브에서 bash 스크립트로 배열 생성

저는 bash 스크립트를 작성 중이며 USB를 통해 연결된 각 마운트된 외장 하드 드라이브에 대한 키와 속성을 보유하는 연관 배열을 생성하는 방법을 찾으려고 합니다. 여기서 사용하는 예는 연관 배열이지만 반드시 그럴 필요는 없습니다. 나는 이것이 가장 의미가 있다고 생각합니다. 예, 연관 배열을 지원하기 위해 bash 4를 사용하고 있습니다.

> /bin/bash --version
GNU bash, version 4.4.12(1)-release (x86_64-apple-darwin16.3.0)

현재 저는 diskutil list루프에서 및 하위 쉘을 사용하고 있습니다. 또는 , 및 명령을 혼합하여 파이프를 통해 여러 출력을 구문 분석할 수도 있습니다. 지금까지 아무 소용이 없습니다. 이러한 Apple 명령은 Bluetooth 장치 및 로컬 하드 드라이브와 같이 폐기하고 싶은 다른 항목을 출력한다는 점에 유의해야 합니다. 자세한 내용은 아래를 참조하세요.system_profiler SPUSBDataTypeforsedgrepawk

내가 원하는 배열은 다음과 같습니다 myArray=([Name1]=/dev/disk3s2 [Name2]=/dev/disk4s2). 이름과 마운트 지점만 있으면 됩니다. 그 형식은 유연합니다. 나중에 다른 형식으로 되어 있으면 구문 분석할 수 있습니다. 간단하거나 비슷한 일을 할 수 있으면 됩니다 for i in "!${myArray[@]}; do echo "Name = ${i}"; echo "mount point = ${myArray[$i]}"; done.

참고: 하루가 끝나면 "N개의 외장 하드 드라이브가 설치되어 있습니다. 백업을 수행할 드라이브를 선택하십시오"와 같은 메시지가 표시됩니다.

diskutil list여기에서 요청한 대로 두 가지 주요 명령( 및 ) 의 샘플 출력을 사용하여 system_profiler SPUSBDataType목표를 달성했습니다. 동일한 목표를 달성하기 위한 다른 방법이 있는지 여부는 상관하지 않는다는 점에 유의해야 합니다. 그 밖에 유용한 명령어를 알고 계시다면 추천 부탁드립니다.

> diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.3 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage Macintosh HD            499.4 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3

/dev/disk1 (internal, virtual):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           +499.1 GB   disk1
                                 Logical Volume on disk0s2
                                 A0B29294-0031-40CB-8894-6F56545CCF3C
                                 Unencrypted

/dev/disk3 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *2.0 TB     disk3
   1:                        EFI EFI                     209.7 MB   disk3s1
   2:                  Apple_HFS Storage                 2.0 TB     disk3s2

그리고

> system_profiler SPUSBDataType
USB:

    USB 3.0 Bus:

      Host Controller Driver: AppleUSBXHCIWPT
      PCI Device ID: 0x9cb1
      PCI Revision ID: 0x0003
      PCI Vendor ID: 0x8086

        BUP Slim SL:

          Product ID: 0xab26
          Vendor ID: 0x0bc2  (Seagate LLC)
          Version: 1.08
          Serial Number: NA96KBJB
          Speed: Up to 5 Gb/sec
          Manufacturer: Seagate
          Location ID: 0x14500000 / 3
          Current Available (mA): 900
          Current Required (mA): 896
          Extra Operating Current (mA): 396
          Media:
            BUP Slim SL:
              Capacity: 2 TB (2,000,398,933,504 bytes)
              Removable Media: No
              BSD Name: disk3
              Logical Unit: 0
              Partition Map Type: GPT (GUID Partition Table)
              USB Interface: 0
              Volumes:
                EFI:
                  Capacity: 209.7 MB (209,715,200 bytes)
                  File System: MS-DOS FAT32
                  BSD Name: disk3s1
                  Content: EFI
                  Volume UUID: 0E239BC6-F960-3107-89CF-1C97F78BB46B
                Storage:
                  Capacity: 2 TB (2,000,054,960,128 bytes)
                  Available: 1.3 TB (1,298,787,659,776 bytes)
                  Writable: Yes
                  File System: Journaled HFS+
                  BSD Name: disk3s2
                  Mount Point: /Volumes/Storage
                  Content: Apple_HFS
                  Volume UUID: E9786DAE-78A7-31B7-B939-8FCCE3C147AB

        Bluetooth USB Host Controller:

          Product ID: 0x8290
          Vendor ID: 0x05ac  (Apple Inc.)
          Version: 1.46
          Speed: Up to 12 Mb/sec
          Manufacturer: Broadcom Corp.
          Location ID: 0x14300000 / 2
          Current Available (mA): 500
          Current Required (mA): 0
          Extra Operating Current (mA): 0
          Built-In: Yes

diskutil list | tail -n +15기본적으로 로컬 하드 드라이브 이후의 모든 것을 제공합니다.

제가 가진 또 다른 아이디어는 제가 어떤 진술을 할 수 있다는 것이었습니다 for usb in $(system_profiler SPUSBDataType). 하지만 파이프에 연결할 올바른 하위 쉘 명령 sed과 빈 줄이나 들여쓰기로 구문 분석하는 다른 도구를 grep알아낼 수 없습니다 . awk이렇게 하면 한 번에 해낼 수 없을 것 같아요.

답변1

이 방법은 USB 드라이브가 아닌 외부 드라이브만 검사하기 때문에 효과가 있을지 확신할 수 없지만 주로 사용자의 요구 사항을 충족한다고 생각합니다.

#! /usr/local/bin/bash -
IFS= mapfile -t DISKUTIL_LIST < <(diskutil list external)
declare -A myAssocArray
for line in "${DISKUTIL_LIST[@]}"; do
    DISK_MOUNT=$(echo $line | awk '{print $1}')
    if [[ "${#DISK_MOUNT}" -lt '3' ]]; then
        :
    else
        ARRAY_INDEX=$(mount | grep "$DISK_MOUNT" | awk '{print $3}' | awk -F'/' '{print $NF}')
        MOUNT_POINT=$(mount | grep "$DISK_MOUNT" | awk '{print $1}')
        myAssocArray+=([${ARRAY_INDEX}]="$MOUNT_POINT")
    fi
done
for disk in "${!myAssocArray[@]}"; do
    echo -e "Name:\t\t${disk}\nMount Point:\t${myAssocArray[$disk]}"
done

내 예제 출력(현재 외부는 하나만 있음):

{0} ➔ ./usb-drives.sh
Name:           JBUTRYN
Mount Point:    /dev/disk2s1

관련 정보