私は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 SPUSBDataType
for
sed
grep
awk
私が望む配列は次のとおりです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