BASH: ค้นหาพาร์ติชันจากเอาต์พุต diskutil


1

ฉันกำลังพยายามค้นหาผลลัพธ์ของคำสั่งที่แสดงรายการไดรฟ์ในเครื่องเพื่อค้นหาพาร์ติชันที่เรียกว่า EFI ในบูต HDD

ฉันได้เขียน oneliner ที่สกปรกจริงๆเพราะฉันไม่สามารถหาวิธีที่จะหา HDD หลักได้อย่างมีประสิทธิภาพ (น่าจะเป็น Macintosh HD เสมอ) จากนั้นหาสิ่งที่พาร์ติชัน EFI ในไดรฟ์เดียวกันจากนั้นหา disk # s # IDENTIFIER สำหรับพาร์ติชัน EFI บนไดรฟ์ Macintosh HD

เอาต์พุตมาตรฐานจากdiskutil listบางสิ่งเช่นนี้

$ diskutil list
/dev/disk0
#:                       TYPE NAME                    SIZE       IDENTIFIER
0:      GUID_partition_scheme                        *500.1 GB   disk0
1:                        EFI EFI                     209.7 MB   disk0s1
2:                  Apple_HFS Macintosh HD            499.1 GB   disk0s2
3:                 Apple_Boot Recovery HD             784.2 MB   disk0s3

/dev/disk1
#:                       TYPE NAME                    SIZE       IDENTIFIER
0:      GUID_partition_scheme                        *1.5 TB     disk1
1:                        EFI EFI                     209.7 MB   disk1s1
2:                  Apple_HFS Data                    1.5 TB     disk1s2

ดังนั้นนี่คือหนึ่งซับที่สกปรกที่ฉันใช้ มีวิธีที่ดีกว่าที่ฉันสามารถทำได้หรือไม่? 

diskutil mount $(diskutil list | grep -i 'Macintosh\ HD' | awk '{print $6}' | grep -i 'disk0s')

คำตอบ:


0

ฉันคิดว่า / dev / disk0 เป็น HDD "หลัก" เสมอใช่มั้ย ถ้าไม่ใช่และคุณต้องการค้นหาพาร์ติชัน EFI บนดิสก์ที่ชื่อ "Macintosh HD" แสดงว่า oneliner ของคุณเกือบถูกต้องแล้ว

สำหรับฉัน $ 6 ส่งคืน 'GB' และฉันยังสมมติว่าพาร์ติชัน EFI เป็นดิสก์แรกของดิสก์นั้นเสมอดังนั้นให้ลอง:

diskutil list | grep 'Macintosh HD' | awk '{print $(NF)}' | sed 's/s[0-9]/s1/'

หรือกลอุบาย awk เพิ่มเติม (สำหรับวัดดี):

diskutil list | awk '/Macintosh HD/ { sub(/s[0-9]/, "s1", $(NF)); print $(NF) }'

0

คุณสามารถลองและตรวจหาอุปกรณ์บล็อกหลักโดยใช้:

mount | awk '/on \/ / {print $1}'

ฉันไม่สามารถหาวิธีตรวจหาโวลุ่มหลักของฉันได้เนื่องจากเอาต์พุตของฉันไม่ได้แสดงรายการไว้ฉันสามารถเห็นอุปกรณ์บล็อกหลักและคำอธิบายเนื้อหาบางส่วนเท่านั้น:

/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage                         250.1 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           *249.8 GB   disk1
                                 Logical Volume on disk0s2
                                 XXXXXXXX-XXXX-XXXX-XXXX-7C6C089FXXXX
                                 Unencrypted

ในกรณีของฉันฉันสามารถใช้งานได้ง่ายawk '/Logical Volume/ {print $NF}'แต่สคริปต์ที่มีประสิทธิภาพยิ่งกว่านั้นจะพิจารณาเวอร์ชัน Mac เพื่อตรวจสอบกรณีที่เป็นไปได้ทั้งหมด

BTW ฉันใช้โยเซมิตี 10.10.4 บน MBP 15 "กลางปี ​​2014


0

โอเคนี่ยังไม่เสร็จ แต่ฉันหมดเวลาแล้ว

ดังนั้นฉันใช้คำสั่ง df เพราะฉันรู้ว่านี่จะมีจุดเชื่อมต่อในตอนท้าย จากนั้นฉัน grep มันด้วยรูปแบบของการขึ้นบรรทัดใหม่เฉือน จากนั้นฉันก็อยากจะตัดทุกอย่างหลังจากออกจากช่องว่างแรก แต่การตัดออกใช้ไม่ได้ในตอนนี้ ไม่รู้จริง ๆ ว่าฉันทำอะไรผิดและฉันต้องเริ่มทำงานให้กับงานของฉันในตอนนี้ แต่บางทีคุณอาจปรับปรุงคุณลักษณะการทุบตีได้ ขออภัยไม่มีเวลาค้นหาคู่มือเพื่อค้นหาความผิดพลาดของฉัน แต่เราเกือบจะถึงแล้ว:

การแก้ไข:

foo=$(df -h | grep -e ' /$'); loo=${foo%%" "*}; echo $loo

ตอนนี้มันใช้งานได้ ลองมัน :)

แก้ไข: โอ้ฉันเพิ่งรู้ว่าฉันใช้ lvg ดังนั้น disk0s [0-4] จะถูกแปลเป็น disk1 ดังนั้นลองทดสอบและบอกฉันว่านี่แสดงดิสก์ที่ถูกต้องที่คุณไม่ได้ใช้ lvg หรือไม่

แก้ไข 2: ยังคงไม่ทำงานสำหรับกลุ่มโลจิคัลวอลุ่มที่เข้ารหัส แต่ถ้าคุณสามารถทดสอบอันนี้ได้โดยไม่ต้องใช้ FileVault ก็ควรใช้งานได้

foo=$(mount | grep -e ' / '); foo=${foo%%" "*}; diskutil list | grep "[0-99]:" | grep ${foo##"/dev/"} | grep EFI)

นี่จะมองหา EFI บนดิสก์ที่เมาท์เป็นรูทดังนั้นมักจะเป็น MacintoshHD

แก้ไข 3: นี่ยอดเยี่ยมมากที่จะฆ่าเวลาในที่ทำงาน โอเคฉันเดาว่าสิ่งนี้ควรให้คำตอบที่ถูกต้องแก่คุณ มันสามารถทำได้แม้ว่าจะเป็น FileVault ที่เข้ารหัส

#!/bin/bash

maindrive=$(mount | grep -e " / ")
maindrive_exact=${maindrive%%" "*}
maindrive_reduced=${maindrive_exact##"/dev/"}

if [ "$(diskutil list | grep Unlocked)" = "" ]
        then
                diskline=$(diskutil list | grep "[0-99]:" | grep $maindrive_reduced | grep EFI)
                diskline_cut1=${diskline##*"B "}
                diskline_cut2=${diskline##*" "}
                echo "/dev/$diskline_cut2"

        else
                alldisk=$(diskutil list)
                alldisk_cut1=${alldisk##*${maindrive_reduced}}
                alldisk_cut2=${alldisk_cut1#*"Logical Volume on "}
                alldisk_cut3=${alldisk_cut2%%" "*}
                echo /dev/$alldisk_cut3
fi

ดังนั้นควรให้พาร์ติชัน EFI ในฮาร์ดไดรฟ์เดียวกันกับโฟลเดอร์รูทของคุณ MacintoshHD

แก้ไข 4 (หวังว่าเวอร์ชั่นสุดท้าย)

#!/bin/bash

maindrive=$(mount | grep -e " / ")
maindrive_exact=${maindrive%%" "*}
maindrive_reduced=${maindrive_exact##"/dev/"} 


function getdisknumber {
diskline=$(diskutil list | grep "[0-99]:" | grep $maindrive_reduced | grep EFI)
                diskline_cut1=${diskline##*"B "}
                diskline_cut2=${diskline##*" "}
                echo "/dev/$diskline_cut2"
}

if [ "$(diskutil list | grep Unlocked)" = "" ] 
    then 
        getdisknumber   
    else 
        alldisk=$(diskutil list)
        alldisk_cut=${alldisk#*${maindrive_reduced}}
        alldisk_cut=${alldisk_cut#*"Logical Volume on "}
        alldisk_cut=${alldisk_cut%%" "*}
        alldisk_cut=${alldisk_cut%s*}
        maindrive_reduced=$alldisk_cut
        getdisknumber
fi

และนี่คือคำอธิบาย

Okay, as ask in the comment, the explanation what %%,%,##,# means. 
All those symbols cut out information of a string.
%%pattern cuts out the biggest pattern matching part to the right.
%pattern cuts out the smallest pattern matching part to the right.
##pattern cuts out the biggest pattern matching part to the left
#pattern cuts out the smallest pattern matching part to the left

ตอนนี้ส่วนอื่นของสคริปต์พยายามค้นหาฮาร์ดไดรฟ์ที่ถูกต้องเมื่อเผชิญหน้ากับ FileVault ที่สร้างโวลุ่มที่เข้ารหัส จากนั้นฟังก์ชั่นจะตัดฮาร์ดไดรฟ์นี้ลงไปยังข้อมูลดิสก์บนฮาร์ดไดรฟ์นี้โดยมองหา EFI เป็นคำหลัก

นี่คือลิงค์เกี่ยวกับการตัดสตริงในทุบตีการ ตัดสตริง

แก้ไข 5: เอาล่ะ การย้ำอีกครั้งของสคริปต์นี้ มากไปมากถึงพื้นฐาน

#!/bin/bash

## Find the main hard drive

maindrive=$(mount | grep -e " / ")
maindrive=${maindrive#/dev/}
maindrive=${maindrive%%" "*}


## Checking for FileVault

if [ "" != "$(diskutil list /dev/disk1 | grep "Unlocked Encrypted")" ]
        then
                maindrive=$(diskutil list | grep "Logical Volume on")
                maindrive=${maindrive#*"Logical Volume on "}
                maindrive=${maindrive%s*}
fi


## Checking for EFI

EFI_DRIVE=$(diskutil list /dev/$maindrive | grep EFI)
EFI_DRIVE=${EFI_DRIVE##*" "}
echo "/dev/$EFI_DRIVE"

เพื่อให้เสร็จสมบูรณ์นั่นคือรายการดิสดิซูลของฉัน:

/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *250.1 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage                         249.2 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           *248.8 GB   disk1
                                 Logical Volume on disk0s2
                                 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                                 Unlocked Encrypted

และสิ่งนี้จะเกิดขึ้นเมื่อฉันรันสคริปต์:

Joes-MacBook-Pro:EFI_Script joe$ chmod +x EFI_Script
Joes-MacBook-Pro:EFI_Script joe$ ./EFI_Script
/dev/disk0s1
Joes-MacBook-Pro:EFI_Script joe$

ฉันคิดว่าทำไมมันไม่ได้ผลสำหรับคุณจนถึงตอนนี้ โดยพื้นฐานแล้วถ้ามันไม่ได้ผลผมก็ต้องการข้อมูลสองอย่างจากคุณ ก่อนอื่นฉันต้องรู้เอาต์พุตของคุณสำหรับคำสั่ง 'mount' ฉันมีลักษณะเช่นนี้:

Joes-MacBook-Pro:EFI_Script joe$ mount
/dev/disk1 on / (hfs, local, journaled)
devfs on /dev (devfs, local, nobrowse)
map -hosts on /net (autofs, nosuid, automounted, nobrowse)
map auto_home on /home (autofs, automounted, nobrowse)

อย่างที่คุณเห็นมันให้จุดเมานต์ '/' บน 'disk1' ฉันเดาเอาเองว่าถ้า FileVault ปิดอยู่มันจะให้จุดเมานท์ของคุณบน disk0 แต่บางทีฉันผิดและไม่มีระบบที่ FileVault ถูกปิด ดังนั้นหากจุดเมานต์ของคุณยังอยู่ใน disk1 ในขณะที่ EFI อยู่บน disk0 ก็ควรกลับมาว่างเปล่าหรือมีเพียง / dev / เนื่องจากเป็นสิ่งที่ฉันเพิ่มด้วยตนเอง ในทางกลับกันถ้าฉันจำได้อย่างถูกต้องคุณมีพาร์ติชัน EFI ใน disk1 ด้วย

อย่างไรก็ตามสิ่งที่สองที่ฉันต้องการก็คือคุณรันสคริปต์นี้ด้วยคำสั่ง 'bash -x script' เพื่อให้มันแสดงสิ่งที่มันทำในขณะที่มันกำลังทำงานอยู่ ด้วยวิธีนี้เราสามารถเห็นสิ่งที่ผิดพลาด

อย่างไรก็ตามฉันหวังว่ามันจะใช้งานได้และเราไม่ต้องไปไกลขนาดนี้ แต่ถ้าไม่เราต้องหาวิธีอื่นเพื่อหาฮาร์ดไดรฟ์หลัก

อย่างไรก็ตามทดสอบมัน ไชโย!


Wow @ TheCommoner282 คุณไปที่เมืองหนึ่ง foo=$(df -h | grep -e ' /$'); loo=${foo%%" "*}; echo $looและ `ผลิต ID ไดรฟ์ที่ไม่ถูกต้อง foo=$(mount | grep -e ' / '); foo=${foo%%" "*}; diskutil list | grep "[0-99]:" | grep ${foo##"/dev/"} | grep EFI; echo $fooทั้งผลิต / dev / disk0s2 มากกว่า / dev / disk0s1 ฉันจะทดสอบสคริปต์อีกต่อไปของคุณในวันพรุ่งนี้ คุณสามารถอธิบายสิ่งที่น่าสนใจการใช้งาน %% และ ## อักขระของคุณกำลังทำอยู่เพราะฉันไม่พบเอกสารใด ๆ เช่นใน $ {maindrive %% "" *} หรือไม่ ฉันกระตือรือร้นที่จะเรียนรู้
juliushibert

ฉันจะแก้ไขคำอธิบายนอกจากนี้ฉันพบข้อผิดพลาดในสคริปต์ของฉันและจะแก้ไขให้ถูกต้อง
TheCommoner282

โอ้พระเจ้าคุณถูกต้อง ฉันแค่ดูที่บรรทัดที่สอง นี่เป็นเพียงการถ่ายโอนข้อมูล ฉัน 'echo $ foo' ซึ่งไม่เปลี่ยนแปลงในขั้นตอนที่สอง และรายการ 'diskutil' ก่อนหน้านี้อาจจะว่างเปล่า เริ่มต้นไม่ดี แต่หวังว่าการทำซ้ำครั้งที่สี่จะได้ผล
TheCommoner282

ขออภัยฉันใช้เวลาสักครู่เพื่อทดสอบข้อเสนอแนะสุดท้ายของคุณ @ TheCommoner282 สคริปต์ส่งออก/dev/โดยไม่เจตนา ขอบคุณสำหรับการอธิบายเกี่ยวกับการตัดใน BASH ข้อมูลที่ดีจริงๆที่จะรู้
juliushibert

ช่างแปลกเหลือเกิน ฉันเดาว่าต้องมีความแตกต่างบางอย่างระหว่างผลลัพธ์ diskutil ของเราที่ฉันไม่ได้คำนึงถึง ฉันจะเขียนสคริปต์ใหม่และพยายามทำบัญชี นอกจากนี้ฉันจะพยายามเพิ่มใช้ผลลัพธ์ที่คุณโพสต์เพื่อการทดสอบ ฉันมีความคิดหรือสองวิธี จำกัด ข้อมูลนี้ให้น้อยลงหมายถึงการตัดน้อยลงและทำให้เกิดข้อผิดพลาดหรือโอกาสน้อยลง คุณสามารถคาดหวังเวอร์ชั่นใหม่นี้ได้จนถึงวันพรุ่งนี้ ฉันจะทำมันคืนนี้ (ขึ้นอยู่กับยุโรป GMT + 1)
TheCommoner282
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.