我想要的输出:
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
答案1
您所询问的大括号扩展只会扩展磁盘上与您使用的模式匹配的文件/目录。您将遇到的另一个问题是diskutil
可能无法一次处理超过 1 个参数。要扩展这些,您需要执行while
or循环,并在迭代循环时for
将结果传递给。diskutil
例子
$ for i in /dev/*; do diskutil "$i";done
至于你的第二个问题,在磁盘上没有相应文件/目录的情况下,实际上没有任何方法可以使用大括号扩展来帮助你。
解析diskutil
鉴于此命令的输出,您将不得不使用诸如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
答案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
。