표적
디스크 번호를 읽고 마운트 명령을 실행할 수 있는 간단한 단일 라이너는 무엇입니까?
한 줄의 코드로 다음과 같은 작업이 실행됩니다.
./mountEFI.command disk3
배경
user@mac ~ % diskutil 목록
반품
/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.
한 줄의 코드는 다음과 동등한 작업을 수행해야 합니다.
./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
일치하지 않는 입력 행을 인쇄하지 마십시오.
첫 번째 필드는 첫 번째 이전의 빈 문자열이고 /
, 두 번째 필드는 첫 번째와 두 번째 /
( dev
) 사이의 모든 항목이며, 세 번째 필드는 두 번째 /
와 첫 번째 공백 문자( 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
을 한 번 실행하려고 시도합니다(또는 시스템의 ARG_MAX에 따라 수천 줄이 있는 경우 가능한 한 적은 횟수... Mac에서는 무엇인지 모르지만 Linux에서는 약 200입니다.) 백만 자이므로 "많은") 가능한 한 많은 인수를 사용하여(예: xargs는 disk0 및 disk1이 패턴과 일치하면 실행됨) ./mountEFI.command disk0 disk1
여러 인수를 반복할 수 없으면 작동하지 않습니다../mountEFI.command