Bash
如何使用 bash 擴展或替換列出 /dev/disks 數組的資訊?
我想要的輸出:
diskutil list; diskutil info [multiple devices]
無需做:
diskutil info disk0; diskutil info disk0s1; diskutil info disk1
…ETC例如,對於許多內置命令,如
touch
rm
mkdir
等。我可以使用括號擴展對文件的多個版本執行命令:mkdir njboot0{1,2,3}
或者,在搜尋時,我可以使用特殊字元來指定匹配字元串中的特定模式,例如:
find ~/ -type f \( -name *mp3 -or -name *mp4 \)
但:
diskutil info disk{0,0s1,1,1s1} #syntax error diskutil info /dev/* #syntax error (diskutil info disk$'')$'0|1|2' #syntax error diskutil info disk\(0,s0\) #syntax error
ETC…
diskutil info disk${disk}'0'$'s1' #okay, getting somewhere. this works at least.
- 如何
diskutil
在多個磁碟上正確執行上述命令?- 我可以遵循任何通用語法進行擴展/替換嗎?
根據要求,這是輸出
diskutil list
:/dev/disk0 #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *1.0 TB disk0 1: EFI EFI 209.7 MB disk0s1 2: Apple_HFS Macintosh HD 999.7 GB disk0s2 3: Apple_Boot Recovery HD 650.0 MB disk0s3
您詢問的大括號擴展只會擴展磁碟上與您使用的模式匹配的文件/目錄。您將遇到的另一個問題是一次
diskutil
可能無法處理超過 1 個參數。要擴展這些,您需要執行while
orfor
循環,並在diskutil
您遍歷循環時將結果傳遞給。例子
$ for i in /dev/*; do diskutil "$i";done
至於您的第二個問題,在磁碟上沒有相應文件/目錄的情況下,實際上沒有任何方法可以幫助您進行大括號擴展。
解析磁碟
鑑於此命令的輸出,您將不得不求助於使用諸如
awk
,之類的工具sed
,或grep
“解析”此輸出,以便您可以獲得有關磁碟的有意義的資訊,以進行diskutil
第二次呼叫的進一步查詢。例子
diskutil
這是使用grep
and解析輸出的粗略sed
。有更有效的方法可以做到這一點,但這向您展示了一般方法。$ diskutil list | grep -E "[ ]+[0-9]+:.*disk[0-9]+" | sed 's/.*\(disk.*\)/\1/' disk0 disk0s1 disk0s2 disk0s3
使用這種方法,您可以
for
像這樣修改上面的循環:$ for i in $(diskutil list | grep -E "[ ]+[0-9]+:.*disk[0-9]+" | \ sed 's/.*\(disk.*\)/\1/'); do diskutil info $i; done