ターゲット
ディスク番号を読み取ってマウントコマンドを実行できるシンプルなシングルライナーは何ですか?
1行のコードで、次のタスクが実行されます。
./mountEFI.command disk3
背景
user@mac~%diskotil リスト
返品
/dev/disk0 (internal, physical):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *128.0 GB disk0
1: EFI NO NAME 104.9 MB disk0s1
2: Microsoft Reserved 16.8 MB disk0s2
3: Microsoft Basic Data NTFS 127.4 GB disk0s3
4: Windows Recovery 525.3 MB disk0s4
/dev/disk1 (internal, physical):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *1.0 TB disk1
1: EFI EFI 209.7 MB disk1s1
2: Apple_APFS Container disk2 1000.0 GB disk1s2
/dev/disk2 (synthesized):
#: TYPE NAME SIZE IDENTIFIER
0: APFS Container Scheme - +1000.0 GB disk2
Physical Store disk1s2
1: APFS Volume LANCE - Data 60.7 GB disk2s1
2: APFS Volume LANCE 15.3 GB disk2s3
3: APFS Snapshot com.apple.os.update-... 15.3 GB disk2s3s1
4: APFS Volume Preboot 309.8 MB disk2s4
5: APFS Volume Recovery 620.4 MB disk2s5
6: APFS Volume VM 1.1 MB disk2s6
/dev/disk3 (external, physical):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *61.5 GB disk3
1: EFI EFI_USB 209.7 MB disk3s1
2: Apple_HFS Install macOS Monterey 61.2 GB disk3s2
だから:
diskutil list | grep '(external, physical)'
返品
/dev/disk3 (external, physical):
^ ^
6 10
目標は、文字6-10を返すことです。ディスク3。
1行のコードは、次のような操作を実行する必要があります。
./mountEFI.command disk3
ディスク番号を読み取ってマウントコマンドを実行できるシンプルなシングルライナーは何ですか?
修正する
diskutil list -plist external physical
返品
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AllDisks</key>
<array>
<string>disk3</string>
<string>disk3s1</string>
<string>disk3s2</string>
</array>
<key>AllDisksAndPartitions</key>
<array>
<dict>
<key>Content</key>
<string>GUID_partition_scheme</string>
<key>DeviceIdentifier</key>
<string>disk3</string>
<key>OSInternal</key>
<false/>
<key>Partitions</key>
<array>
<dict>
<key>Content</key>
<string>EFI</string>
<key>DeviceIdentifier</key>
<string>disk3s1</string>
<key>DiskUUID</key>
<string>5F5C5E00-71B1-4259-B062-95683183898B</string>
<key>Size</key>
<integer>209715200</integer>
<key>VolumeName</key>
<string>EFI_USB</string>
<key>VolumeUUID</key>
<string>0E239BC6-F960-3107-89CF-1C97F78BB46B</string>
</dict>
<dict>
<key>Content</key>
<string>Apple_HFS</string>
<key>DeviceIdentifier</key>
<string>disk3s2</string>
<key>DiskUUID</key>
<string>059700E8-2B72-4669-9030-7C783AA398FB</string>
<key>MountPoint</key>
<string>/Volumes/Install macOS Monterey</string>
<key>Size</key>
<integer>61186465792</integer>
<key>VolumeName</key>
<string>Install macOS Monterey</string>
<key>VolumeUUID</key>
<string>14B0CA5F-27B4-31E3-8096-9235338AFBBD</string>
</dict>
</array>
<key>Size</key>
<integer>61530439680</integer>
</dict>
</array>
<key>VolumesFromDisks</key>
<array>
<string>Install macOS Monterey</string>
</array>
<key>WholeDisks</key>
<array>
<string>disk3</string>
</array>
</dict>
</plist>
答え1
"/dev/"
and more の間の部分が好きなように聞こえる" (external, physical):"
ので、次のようになります。
diskutil list | sed -n 's|^/dev/\(.*\) (external, physical)$|\1|p'
cut
一部の入力の各行で一定の範囲のバイトを返すことができますが、その入力はパラメータではなく標準入力を通過する必要があります。
diskutil list | grep '(external, physical)' | cut -b 6-10
disk10
ただし、この方法は、名前がこのパターンに従わない上記のデバイスまたはブロックデバイスでは失敗します。
前のスペースを削除した各行(アポストロフィ、二重引用符、またはバックスラッシュが含まれていないと仮定)を./mountEFI.command
usingへの別々の呼び出しの引数として渡すことができますxargs
。
diskutil list |
sed -n 's|^/dev/\(.*\) (external, physical)$|\1|p' |
xargs -I DISK ./mountEFI.command DISK
答え2
私はawkを使います:
(Macがないため、awkへの入力としてサンプル出力を含むテキストファイルを使用しました。awkと同じように動作しますdiskutil list | awk ...
)
$ awk -F'[/ ]' '/external, physical/ { print $3 }' /tmp/diskutil.list
disk3
(スペース)をフィールド区切り文字として使用すると、このawkスクリプトは/
"external、physical"に一致するすべての行の3番目のフィールド()のみを印刷します。
$3
一致しない入力行を印刷しないでください。
最初のフィールドは最初の前の空の文字列で/
、2番目のフィールドは1番目と2番目の/
(dev
)の間のすべての項目、3番目のフィールドは2番目/
と1番目の空白文字(disk3
)の間のすべての項目です。
./mountEFI.command
ディスクごとに実行するには、次のものを使用できますxargs
。
diskutil list awk -F'[/ ]' '/external, physical/ { print $3 }' | xargs -L 1 ./mountEFI.command
-L 1
xargsに実行するように指示する./mountEFI.command
一行に一度awkに複数の出力ラインがある場合。
そうでない場合は、-L 1
コマンドxargs
を1回実行しようとします(またはシステムのARG_MAXに応じて数千行がある場合は、できるだけ少ない回数... Macでは何かわかりませんが、Linuxでは約200です。)百万文字なので「たくさん」複数の引数を使用して(xargsは、disk0とdisk1がパターンと一致する場合に実行されます)、複数の引数を繰り返すことが./mountEFI.command disk0 disk1
できない場合は機能しません。./mountEFI.command