ターゲット

ターゲット

ターゲット

ディスク番号を読み取ってマウントコマンドを実行できるシンプルなシングルライナーは何ですか?

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.commandusingへの別々の呼び出しの引数として渡すことができます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 1xargsに実行するように指示する./mountEFI.command 一行に一度awkに複数の出力ラインがある場合。

そうでない場合は、-L 1コマンドxargsを1回実行しようとします(またはシステムのARG_MAXに応じて数千行がある場合は、できるだけ少ない回数... Macでは何かわかりませんが、Linuxでは約200です。)百万文字なので「たくさん」複数の引数を使用して(xargsは、disk0とdisk1がパターンと一致する場合に実行されます)、複数の引数を繰り返すことが./mountEFI.command disk0 disk1できない場合は機能しません。./mountEFI.command

関連情報