lister le nom des volumes montés [RESOLU], même avec des noms composés |
Bienvenue invité ( Connexion | Inscription )
lister le nom des volumes montés [RESOLU], même avec des noms composés |
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. -------------------- |
|
|
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
|
|
|
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
|
|
|
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" -------------------- |
|
|
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
|
|
|
Guest_JacqR_* |
12 Aug 2015, 14:13
Message
#6
|
Guests |
Bonjour,
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'
|
|
|
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 |
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 -------------------- |
|
|
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 |
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 |
|
|
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 |
Bonjour, 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. -------------------- |
|
|
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 |
|
|
Guest_JacqR_* |
13 Aug 2015, 00:31
Message
#11
|
Guests |
Bonsoir,
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 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 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 |
|
|
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
-------------------- |
|
|
Nous sommes le : 28th March 2024 - 10:28 |