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

メモ:1日の終わりに、「N個の外付けハードドライブが取り付けられています。バックアップを実行するドライブを選択してください」などのメッセージが表示されます。

diskutil listここで要求されたように、2つの主要なコマンド(および)のサンプル出力を使用して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

私の出力例(現在の外部は1つしかありません):

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

おすすめ記事