Trova disco allegato specifico, non volume, di Applescript

2

Ho uno script che uso per formattare qualsiasi scheda SD inserita, copiare i dati da cartelle specifiche ad esso, quindi espellere.

Ogni formato / copia viene attivato manualmente, come parte di un processo batch che coinvolge forse un centinaio di carte, quindi non sono preoccupato di premere il pulsante Start nel momento sbagliato o sulla carta sbagliata.

Quello che sto cercando di trovare è come essere assolutamente sicuro di scrivere nel disco corretto

Questa è la mia linea "importante"
do shell script "diskutil eraseDisk \"MS-DOS FAT16\" " & diskName & " MBRFormat disk6"

Il disk6 non è assoluto, in quanto non sempre ho montato lo stesso numero di unità. Posso verificarlo manualmente prima di avviare il batch, utilizzando diskutil list , quindi modificare quel parametro nello script.

Quello che mi piacerebbe essere in grado di fare è che lo script stesso controlli quale unità dovrebbe essere, quindi inseriscilo come variabile, evitando "scelte sbagliate".

Le unità escluse sarebbero non rimovibili e amp; Dischi RAM [presumibilmente volumi non montati come EFI e amp; Il recupero non ha bisogno di essere filtrato] - questi hanno nomi di volume noti - ma non riesco a capire come impostare un nome di volume trovato [conosciuto o sconosciuto, dato che le schede SD possono essere chiamate praticamente prima di iniziare] su uno specifico numero del disco.

Specifiche sul lettore di schede, integrato nel mio monitor, Dell U2713H
Collegato tramite USB2 da Mac Pro 4,1 [con aggiornamento hardware 5,1]

USB Hi-Speed Bus:

  Host Controller Location: Built-in USB
  Host Controller Driver:   AppleUSBEHCI
  PCI Device ID:    0x3a3c 
  PCI Revision ID:  0x0000 
  PCI Vendor ID:    0x8086 
  Bus Number:   0xfa 

Hub:

  Product ID:   0x8043
  Vendor ID:    0x0451  (Texas Instruments)
  Version:  1.00
  Serial Number:    79000089BFB9
  Speed:    Up to 480 Mb/sec
  Location ID:  0xfa200000 / 2

//snips other devices//

USB3.0 Card Reader:

  Product ID:   0x0307
  Vendor ID:    0x0bda  (Realtek Semiconductor Corp.)
  Version:  1.63
  Serial Number:    201006010301
  Speed:    Up to 480 Mb/sec
  Manufacturer: Realtek
  Location ID:  0xfa233000 / 5

Output di esempio di df

Filesystem    512-blocks       Used  Available Capacity   iused     ifree %iused  Mounted on
/dev/disk1s2  1950314272  485618064 1464184208    25%  60766256 183023026   25%   /
devfs                412        412          0   100%       714         0  100%   /dev
/dev/disk0s2  3906357344 1195025808 2711331536    31% 149378224 338916442   31%   /Volumes/JuSpace
/dev/disk3s2  1951855464  635192376 1316663088    33%  79399045 164582886   33%   /Volumes/Downloads
/dev/disk2s2  5858067520 2309215360 3548852160    40% 144325958 221803260   39%   /Volumes/OhDaSpace
/dev/disk4s2  5753889792 4638480736 1115409056    81% 289905044  69713066   81%   /Volumes/TMach
map -hosts             0          0          0   100%         0         0  100%   /net
map auto_home          0          0          0   100%         0         0  100%   /home
/dev/disk3s4   408324240  210669592  197654648    52%    200589  98828207    0%   /Volumes/MacWin7
/dev/disk5       2097152     700536    1396616    34%     87565    174577   33%   /Volumes/RAM Disk
/dev/disk7s1     1936768     104192    1832576     6%       512         0  100%   /Volumes/F_CARD

Oppure ... Usando ioreg -l con il seguente risultato

| |   |   |             +-o Generic- SD/MMC/MS/MSPRO Media  <class IOMedia,$
| |   |   |               | {
| |   |   |               |   "Removable" = Yes
| |   |   |               |   "Content" = "FDisk_partition_scheme"
| |   |   |               |   "Whole" = Yes
| |   |   |               |   "Leaf" = No
| |   |   |               |   "BSD Name" = "disk7"

come faccio a correggere qualcosa come grep -A 100 SD/MMC/MS/MSPRO Media | grep disk | awk... per trovare disk7

    
posta Tetsujin 23.09.2015 - 09:59
fonte

1 risposta

2

Non sono così bravo a scrivere script Apple, ma ecco un'idea su come risolvere il tuo problema.

Nel primo metodo descritto di seguito, cerco l'albero dei dispositivi di system_profiler per ottenere il DiskIdentifier di un dispositivo disco collegato al lettore di schede USB3 integrato nel monitor Dell. Nel secondo metodo uso ioreg.

system_profiler:

Per ottenere il DiskIdentifier di una scheda SD collegata all'SD-Reader esterno usa qualcosa del tipo:

system_profiler -detailLevel mini | grep -A 30 0x0307 | awk '/disk/ {gsub("BSD Name:", ""); print $NF}'

con grep -A 30 0x0307 : mostra le 30 linee seguenti dopo aver trovato la stringa 0x0307
e awk '/disk/ {gsub("BSD Name:", ""); print $NF}' per ottenere il numero del disco, ma rimuovere Nome BSD: dall'output.

Il comando impiega circa 10 secondi sul mio sistema.

Potrebbe essere necessario regolare il valore di -A e la stringa caratteristica (nell'esempio sopra ho utilizzato l'ID prodotto del lettore di schede USB3.0: 0x0307). Controlla l'albero dei dispositivi con l'app Informazioni di sistema e cerca una stringa appropriata.

Avvolgi tutto in una variabile come $ SDDiskToErase e consegnalo al tuo comando diskutil eraseDisk .

Usando la linea leggermente modificata sopra ho ottenuto il diskIdentifier (disk2) di un disco USB esterno direttamente collegato al mio Mac:

system_profiler -detailLevel mini | grep -A 30 0x1c26 | awk '/disk/ {gsub("BSD Name:", ""); print $NF}'
disk2

ioreg:

Un altro comando iniziale è ioreg -l | grep … (... è simile al precedente) che è molto più veloce (meno di un secondo).

Collega una SD-card e ottieni il suo DiskIdentifier con diskutil list . Quindi fai un dump di ioreg con ioreg -l > ~/Desktop/ioreg-dump.txt .

Cerca in ioreg-dump.txt per il diskIdentifier trovato sopra. Il disco è collegato a un controller superiore (quello del monitor) visualizzato dalle lunghe "linee" verticali e corte orizzontali a sinistra nel file stupido. Utilizzare una stringa caratteristica e univoca del controller come un numero seriale, IOName, ID dispositivo ecc. Quindi scegliere un numero di righe successive per -Un grande abbastanza per contenere il diskIdentifier (ad esempio disco6) ma abbastanza piccolo da non contenere gli identificatori del volume (ad es. disk6s1).

Esempio:

ioreg -l | grep -A 350 0x100000214 | awk '/disk/ {gsub("\"",""); print $NF}'
disk2

Per usare il comando in Apple Script devi sfuggire a tutti i interni e \ :

"ioreg -l | grep -A 10 SD/MMC/MS/MSPRO | awk '/disk/ {gsub("\"",""); print $NF}'"

diventa:

do shell script "ioreg -l | grep -A 10 SD/MMC/MS/MSPRO | awk '/disk/ {gsub(\"\\"\",\"\"); print $NF}'"
    
risposta data 23.09.2015 - 12:13
fonte

Leggi altre domande sui tag