저는 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
.
참고: 하루가 끝나면 "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