IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> lister le nom des volumes montés [RESOLU], même avec des noms composés
Options
Pixel44
posté 12 Aug 2015, 07:07
Message #1


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 3 307
Inscrit : 17 Jul 2004
Lieu : Nantes
Membre no 21 109



Bonjour,

J'arrive à récupérer le nom des volumes par cette commande :

diskutil list | grep -Ev 'EFI' | grep -Ev 'Apple_Boot' | grep -Ev 'GUID' | grep -Ev 'Apple_partition' | grep -Ev 'NAME' | grep -Ev 'FDisk' | awk '{print $3}'

mais si l'un des noms comporte deux mots (ex : Snow Léopard), la commande ne retourne que Snow.

Si j'ajoute : awk '{print $3,$4}', j'ai bien le nom complet mais aussi la taille de chaque élément/partition pour les noms uniques : ex : Snow Léopard, Lion 9 <--- !!!!

Y-a-t-il une commande pour récupérer le nom de ces volumes uniquement ?

Merci

Ce message a été modifié par Pixel44 - 15 Aug 2015, 06:13.


--------------------
Go to the top of the page
 
+Quote Post
schlum
posté 12 Aug 2015, 09:30
Message #2


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 447
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



"diskutil list" ne donne pas tous les volumes montés (les volumes réseaux n’y sont pas par exemple).

Perso, si je veux une liste des volumes, je fais un programme ^^

CODE
#include <CoreServices/CoreServices.h>
#include <stdio.h>

int main()
{
OSStatus err;
FSVolumeRefNum volRefNum = 0;
FSVolumeInfo volInfo;
HFSUniStr255 volName;
FSVolumeRefNum realVolRefNum;
GetVolParmsInfoBuffer parms;
for(ItemCount volIndex=1;volIndex>0;++volIndex) {
err = FSGetVolumeInfo(volRefNum,volIndex,&realVolRefNum,kFSVolInfoNone,&volInfo,&volName,NULL);
if(err!=noErr)
break;
err = FSGetVolumeParms(realVolRefNum,&parms,sizeof(GetVolParmsInfoBuffer));
if(err!=noErr)
continue;
if((parms.vMExtendedAttributes&(1<<bIsAutoMounted))==0) {
char nameUTF8[1024+1];
CFStringRef name = CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault,volName.unicode,volName.l
ength,kCFAllocatorNull);
CFStringGetFileSystemRepresentation(name,nameUTF8,sizeof(nameUTF8));
CFRelease(name);
printf("%s\n",nameUTF8);
}
}
return 0;
}


Compilé avec : gcc -framework CoreFoundation -framework CoreServices -o volumes volumes.c

En fonction du type de volumes qu’on veut, on peut jouer avec vMExtendedAttributes


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
schlum
posté 12 Aug 2015, 10:47
Message #3


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 447
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



Ah pardon, les fonctions utilisée ci-dessus sont deprecated ; il faut passer par CFURL maintenant :


CODE
#include <CoreServices/CoreServices.h>
#include <stdio.h>

int main()
{
CFURLEnumeratorRef volsEnum = CFURLEnumeratorCreateForMountedVolumes(kCFAllocatorDefault,kCFURLEnumeratorDefau
ltBehavior,NULL);
CFURLEnumeratorResult res;
CFURLRef currVol = NULL;
CFErrorRef err = NULL;
while((res=CFURLEnumeratorGetNextURL(volsEnum,&currVol,&err))!=kCFURLEnumeratorEnd) {
if(err!=NULL||currVol==NULL)
continue;
CFBooleanRef isAutomounted = NULL;
if(!CFURLCopyResourcePropertyForKey(currVol,kCFURLVolumeIsAutomountedKey,&isAutomounted,&err)||err!=NULL||isAutomounted==NULL)
continue;
CFBooleanRef isLocal = NULL;
if(!CFURLCopyResourcePropertyForKey(currVol,kCFURLVolumeIsLocalKey,&isLocal,&err)||err!=NULL||isLocal==NULL)
continue;
if(CFBooleanGetValue(isLocal)&&!CFBooleanGetValue(isAutomounted)) {
CFStringRef name = NULL;
if(!CFURLCopyResourcePropertyForKey(currVol,kCFURLVolumeNameKey,&name,&err)||err!=NULL||name==NULL)
continue;
char nameUTF8[1024+1];
if(CFStringGetFileSystemRepresentation(name,nameUTF8,sizeof(nameUTF8)))
printf("%s\n",nameUTF8);
}
}
CFRelease(volsEnum);
return 0;
}


(pour les volumes locaux et non auto-mounted)


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
Pixel44
posté 12 Aug 2015, 11:35
Message #4


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 3 307
Inscrit : 17 Jul 2004
Lieu : Nantes
Membre no 21 109



Merci

Je cherche bien les périphériques connectés (USB, firewire, etc..) . C'est pour être inséré dans un programme Tiers qui ne permet qu'une ligne de commande d'où ma recherche du coté "diskutil"


--------------------
Go to the top of the page
 
+Quote Post
schlum
posté 12 Aug 2015, 11:48
Message #5


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 447
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



Fais gaffe, diskutil te donnera aussi les images disques montées, pas que les disques sur un port interne / externe.


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
Guest_JacqR_*
posté 12 Aug 2015, 14:13
Message #6





Guests






Bonjour,

Citation (Pixel44 @ 12 Aug 2015, 02:07) *
Y-a-t-il une commande pour récupérer le nom de ces volumes uniquement ?


Si vous utilisez le format plist, il suffit de lire le nom entre <string>et</string>
Donc, grep pour obtenir la ligne qui contient <key>VolumeName</key> et la ligne suivante, sed pour obtenir le nom du volume.

Code
diskutil list -plist | grep -A1 '<key>VolumeName</key>' | sed -En 's:.*<string>(.*)</string>:\1:p'
Go to the top of the page
 
+Quote Post
Pixel44
posté 12 Aug 2015, 15:26
Message #7


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 3 307
Inscrit : 17 Jul 2004
Lieu : Nantes
Membre no 21 109



Citation (schlum @ 12 Aug 2015, 12:48) *
Fais gaffe, diskutil te donnera aussi les images disques montées, pas que les disques sur un port interne / externe.


je l'ai constaté mais je n'ai pas d'idée pour ne pas les faire apparaître sad.gif


--------------------
Go to the top of the page
 
+Quote Post
trouspinette
posté 12 Aug 2015, 15:30
Message #8


Macbidouilleur d'Or !
*****

Groupe : Rédacteurs
Messages : 5 063
Inscrit : 19 Feb 2002
Lieu : BZH
Membre no 2 083



Citation (JacqR @ 12 Aug 2015, 15:13) *
Code
diskutil list -plist | grep -A1 '<key>VolumeName</key>' | sed -En 's:.*<string>(.*)</string>:\1:p'

Bordel, j'ai jamais regardé à l'aide de cette plist :-)

Code
sa@macbookprosa: ttys002: 3 files 40b $ diskutil list -plist | grep -A1 '<key>VolumeName</key>' | sed -En 's:.*<string>(.*)</string>:\1:p' | grep -Ev 'EFI' | grep -Ev 'Recovery HD'
INTERNAL
LU-ME-VE
DATAS PROMISE


T'es trop fort JacqR !


--------------------
Quis custodiet ipsos custodes ? - Lorsqu'un sujet est résolu, merci d'indiquer [Résolu] dans le titre de votre post !

Luttons contre le style SMS !!!

iPhone 14Pro Max 256 Go iOS 17• MacBook Pro 16 2019 Core i9 - macOS 12.7.2 - 32 GB RAM - 2 TB • @Orange
Linux • OPNSense / pfSense • Une pointe de Windows aussi • Enfocus Switch Expert • callas pdfToolBox
Go to the top of the page
 
+Quote Post
Pixel44
posté 12 Aug 2015, 15:36
Message #9


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 3 307
Inscrit : 17 Jul 2004
Lieu : Nantes
Membre no 21 109



Citation (JacqR @ 12 Aug 2015, 15:13) *
Bonjour,

Citation (Pixel44 @ 12 Aug 2015, 02:07) *
Y-a-t-il une commande pour récupérer le nom de ces volumes uniquement ?


Si vous utilisez le format plist, il suffit de lire le nom entre <string>et</string>
Donc, grep pour obtenir la ligne qui contient <key>VolumeName</key> et la ligne suivante, sed pour obtenir le nom du volume.

Code
diskutil list -plist | grep -A1 '<key>VolumeName</key>' | sed -En 's:.*<string>(.*)</string>:\1:p'



merci je ne connaissais pas cette syntaxe.


--------------------
Go to the top of the page
 
+Quote Post
Jaypee
posté 12 Aug 2015, 20:04
Message #10


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 486
Inscrit : 29 Aug 2002
Membre no 3 340



Ne faut-il pas un modificateur "non-gourmand", non-greedy
<string>(.*?)</string>

Avec <string>abc</string>def<string>ghi</string> (.*) pourrait capturer "abc</string>def<string>ghi"
Le modificateur ? permet de s'arrêter à la première correspondance, càd "abc".

J-P
Go to the top of the page
 
+Quote Post
Guest_JacqR_*
posté 13 Aug 2015, 00:31
Message #11





Guests






Bonsoir,

Citation (Pixel44 @ 12 Aug 2015, 10:26) *
Citation (schlum @ 12 Aug 2015, 12:48) *
Fais gaffe, diskutil te donnera aussi les images disques montées, pas que les disques sur un port interne / externe.


je l'ai constaté mais je n'ai pas d'idée pour ne pas les faire apparaître sad.gif

C'est possible d'exclure les images disques, on obtient les images disque avec hdiutil info.
Donc, il faut vérifier avec grep qu'une ligne se termine par /le nom du volume$ dans le texte de "hdiutil info", si il trouve le script retourne rien, sinon il retourne le nom du volume.

Code
imgDisk=$(hdiutil info); diskutil list -plist | grep -A1 '<key>VolumeName</key>' | sed -En 's:.*<string>(.*)</string>:\1:p' | while read tName; do  grep -q "/$tName"$ <<<"$imgDisk" || echo "$tName"; done



Citation (Jaypee @ 12 Aug 2015, 15:04) *
Ne faut-il pas un modificateur "non-gourmand", non-greedy
<string>(.*?)</string>

Avec <string>abc</string>def<string>ghi</string> (.*) pourrait capturer "abc</string>def<string>ghi"
Le modificateur ? permet de s'arrêter à la première correspondance, càd "abc".

J-P

Cela n'est pas nécessaire pour ce plist, car il n'y a qu'une seule valeur par ligne.
Citation
des espaces<key>VolumeName</key>newline
des espaces<string>nom du volume</string>newline
Go to the top of the page
 
+Quote Post
Pixel44
posté 13 Aug 2015, 20:07
Message #12


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 3 307
Inscrit : 17 Jul 2004
Lieu : Nantes
Membre no 21 109



Merci beaucoup


--------------------
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 28th March 2024 - 10:28