Encuentre un disco adjunto específico, no volumen, por Applescript

2

Tengo un script que utilizo para formatear cualquier tarjeta SD insertada, copiarle datos de carpetas específicas y luego expulsar.

Cada formato / copia se activa manualmente, como parte de un proceso por lotes que involucra aproximadamente cien tarjetas, por lo que no me preocupa presionar el botón de inicio en el momento incorrecto o en la tarjeta incorrecta.

Lo que estoy tratando de encontrar es cómo estar absolutamente seguro de que estoy escribiendo en el disco correcto

Esta es mi línea 'importante'
do shell script "diskutil eraseDisk \"MS-DOS FAT16\" " & diskName & " MBRFormat disk6"

El disk6 no es absoluto, ya que no siempre tengo la misma cantidad de unidades montadas. Puedo verificarlo manualmente antes de comenzar el lote, usando diskutil list y luego cambiar ese parámetro en el script.

Lo que me gustaría poder hacer es hacer que el script compruebe qué unidad debe ser, luego insértelo como una variable, evitando cualquier "elección incorrecta".

Las unidades excluidas serían no extraíbles y amp; Discos RAM [volúmenes presumiblemente desmontados como EFI & La recuperación no tendría que ser filtrada] - estos tienen nombres de volumen conocidos - pero no puedo averiguar cómo establecer un nombre de volumen encontrado [conocido o desconocido, ya que las tarjetas SD pueden llamarse casi cualquier cosa antes de comenzar] a un determinado número de disco.

Especificaciones específicas del lector de tarjetas, integrado en mi monitor, Dell U2713H
Conectado a través de USB2 desde un Mac Pro 4,1 [con actualización de hardware de 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

Salida de muestra de 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

O ... Usando ioreg -l con el siguiente resultado

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

¿Cómo puedo corregir algo como grep -A 100 SD/MMC/MS/MSPRO Media | grep disk | awk... para encontrar el disk7

    
pregunta Tetsujin 23.09.2015 - 09:59

1 respuesta

2

No soy muy bueno escribiendo guiones de Apple, pero aquí hay una idea de cómo resolver tu problema.

En el primer método descrito a continuación, busco en el árbol de dispositivos de system_profiler para obtener el DiskIdentifier de un dispositivo de disco conectado al lector de tarjetas USB3 integrado en su monitor Dell. En el segundo método utilizo ioreg.

system_profiler:

Para obtener el DiskIdentifier de una tarjeta SD conectada al lector SD externo, use algo como:

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

con grep -A 30 0x0307 : genera las siguientes 30 líneas después de encontrar la cadena 0x0307
y awk '/disk/ {gsub("BSD Name:", ""); print $NF}' para obtener el número de disco, pero elimine BSD Name: de la salida.

El comando tarda unos 10 segundos en mi sistema.

Es posible que tenga que ajustar el valor de -A y la cadena característica (en el ejemplo anterior, usé su lector de tarjetas USB3.0 ID de producto: 0x0307). Verifique el árbol de dispositivos con la aplicación Información del sistema y busque la cadena adecuada.

Envuelva todo eso en una variable como $ SDDiskToErase y entréguela a su comando diskutil eraseDisk .

Usando la línea ligeramente modificada de arriba, obtuve el DiskIdentifier (disk2) de un disco USB externo directamente conectado a mi Mac:

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

ioreg:

Otro comando inicial es ioreg -l | grep … (... es similar al anterior), que es mucho más rápido (menos de un segundo).

Adjunte una tarjeta SD y obtenga su DiskIdentifier con diskutil list . Luego haga un volcado de ioreg con ioreg -l > ~/Desktop/ioreg-dump.txt .

Busque en ioreg-dump.txt para el identificador de disco que se encuentra arriba. El disco está conectado a un controlador superior (el que está en su monitor) visualizado por las largas "líneas" horizontales verticales y cortas a la izquierda en el archivo tonto. Utilice una cadena característica y única del controlador como un número de serie, IOName, ID de dispositivo, etc. Luego, elija una serie de líneas subsiguientes para -Una lo suficientemente grande para contener el identificador de disco (por ejemplo, disco6) pero lo suficientemente pequeña para no contener los identificadores de volumen (por ejemplo, disk6s1).

Ejemplo:

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

Para usar el comando en Apple Script, debes escapar de todo " y \ :

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

se convierte en:

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

Lea otras preguntas en las etiquetas