如何使用 bash 扩展或替换列出 /dev/disks 数组的信息?

如何使用 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. 
  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

答案1

您所询问的大括号扩展只会扩展磁盘上与您使用的模式匹配的文件/目录。您将遇到的另一个问题是diskutil可能无法一次处理超过 1 个参数。要扩展这些,您需要执行whileor循环,并在迭代循环时for将结果传递给。diskutil

例子

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

至于你的第二个问题,在磁盘上没有相应文件/目录的情况下,实际上没有任何方法可以使用大括号扩展来帮助你。

解析diskutil

鉴于此命令的输出,您将不得不使用诸如awksed、 或 之类的工具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

答案2

如果 的输出diskutil list类似于disk0 disk0s1 disk1 disk1s1(用空格或换行符分隔),那么您需要这样的内容:

for dev in $(diskutil list); do
  diskutil info "$dev"
done

寻找

find ~/ -type f \( -name '*mp3' -or -name '*mp4' \)

您必须引用将看到的元字符find

相关内容