Como posso listar as informações para uma matriz de / dev / disks usando expansão ou substituição do bash?

3

Eu quero a saída de:

diskutil list; diskutil info [multiple devices]

Sem ter que fazer:

diskutil info disk0; diskutil info disk0s1; diskutil info disk1 ... etc

Por exemplo, com muitos comandos incorporados como touch rm mkdir , etc. Posso usar a expansão de colchetes para executar comandos em várias versões de um arquivo:

mkdir njboot0{1,2,3}

Ou, ao pesquisar, posso usar caracteres especiais para especificar padrões específicos correspondentes em uma string, como:

find ~/ -type f \( -name *mp3 -or -name *mp4 \)

Mas:

diskutil info disk{0,0s1,1,1s1}    #syntax error

diskutil info /dev/*               #syntax error

(diskutil info disk$'')$'0|1|2'    #syntax error

diskutil info disk\(0,s0\)         #syntax error

etc ...

diskutil info disk${disk}'0'$'s1'  #okay, getting somewhere. this works at least. 
  1. Como executo o comando diskutil mencionado acima em vários discos corretamente?
  2. Existe alguma sintaxe geral que eu possa seguir para expansão / substituição?

Conforme solicitado, esta é a saída de diskutil list :

/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *1.0 TB     disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            999.7 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
    
por njboot 01.07.2014 / 04:07

2 respostas

2

A expansão de chave que você está perguntando só expandirá para arquivos / diretórios que correspondem no disco ao padrão que você usa. O outro problema que você enfrentará é que diskutil talvez não consiga lidar com mais de um argumento por vez. Para expandi-las, é necessário fazer um loop while ou for e passar os resultados para diskutil enquanto você percorre o loop.

Exemplo

$ for i in /dev/*; do diskutil "$i";done

Quanto à sua segunda questão, não existe realmente nenhum método em que a expansão de chaves possa ajudá-lo em situações em que não há arquivos / diretórios correspondentes no disco.

Analisando o diskutil

Dada a saída desse comando, você terá que recorrer ao uso de uma ferramenta como awk , sed ou grep para "analisar" essa saída para obter informações significativas sobre os discos, para mais consultas chamando diskutil pela segunda vez.

Exemplo

Aqui está um resumo da análise da saída de diskutil usando grep e sed . Existem maneiras mais eficientes de fazer isso, mas isso mostra a abordagem geral.

$ diskutil list | grep -E "[ ]+[0-9]+:.*disk[0-9]+" | sed 's/.*\(disk.*\)//'
disk0
disk0s1
disk0s2
disk0s3

Com essa abordagem, você pode modificar o loop for acima da seguinte forma:

$ for i in $(diskutil list | grep -E "[ ]+[0-9]+:.*disk[0-9]+" | \
    sed 's/.*\(disk.*\)//'); do diskutil info $i; done
    
por 01.07.2014 / 04:24
1

Se a saída de diskutil list for algo como disk0 disk0s1 disk1 disk1s1 (separado por espaço ou nova linha), será necessário algo assim:

for dev in $(diskutil list); do
  diskutil info "$dev"
done

encontre

find ~/ -type f \( -name '*mp3' -or -name '*mp4' \)

Você deve citar os metacaracteres que find deve ver.

    
por 01.07.2014 / 04:23