Bash

如何使用 bash 擴展或替換列出 /dev/disks 數組的資訊?

  • July 1, 2014

我想要的輸出:

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. 
  1. 如何diskutil在多個磁碟上正確執行上述命令?
  2. 我可以遵循任何通用語法進行擴展/替換嗎?

根據要求,這是輸出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 個參數。要擴展這些,您需要執行whileorfor循環,並在diskutil您遍歷循環時將結果傳遞給。

例子

$ for i in /dev/*; do diskutil "$i";done

至於您的第二個問題,在磁碟上沒有相應文件/目錄的情況下,實際上沒有任何方法可以幫助您進行大括號擴展。

解析磁碟

鑑於此命令的輸出,您將不得不求助於使用諸如awk,之類的工具sed,或grep“解析”此輸出,以便您可以獲得有關磁碟的有意義的資訊,以進行diskutil第二次呼叫的進一步查詢。

例子

diskutil這是使用grepand解析輸出的粗略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

引用自:https://unix.stackexchange.com/questions/140074