#226 Le 17/04/2025, à 20:08
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
j ' envoie la sauce dans le 1er messageet le github .
La ligne 38 est toujours incorrecte.
iznobe a écrit :j ' ai modifié un peu le script et integré le tableau donc .
… PartMountPoints="$(grep "$Part" /etc/mtab | cut -d " " -f 2)" …
PartMountPoints=( $(grep "$Part" /etc/mtab | cut -d " " -f 2) )
En ligne
#227 Le 17/04/2025, à 20:18
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
arf , z ' avais pas vu
Bon et bien , ca fonctionne nickel tout ca avec ta derniere correction @nany
Dernière modification par iznobe (Le 17/04/2025, à 20:28)
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#228 Le 17/04/2025, à 20:45
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
Juste une petite remarque : AMHA le répertoire /mnt ne devrait pas être supprimé (en même temps, le choisir comme point de montage dans le fstab n’est pas très judicieux).
Dernière modification par nany (Le 17/04/2025, à 20:45)
En ligne
#229 Le 18/04/2025, à 00:38
- tycooon
Re : [ SCRIPT ] pour montage automatique partitions internes
Bonjour,
Bon, je me lance en tant que testeur :
$ sudo ./montage
[sudo] Mot de passe de olivier :
1 ⇒ /dev/sda1 backup ext4
2 ⇒ /dev/sdb3 sauvegarde ntfs
3 ⇒ /dev/nvme0n1p2 ntfs
4 ⇒ /dev/nvme0n1p3 ntfs
5 ⇒ /dev/nvme0n1p5 ext4
Choisissez le numéro correspondant à votre future partition de données : 2
La partition « /dev/sdb3 » a l’étiquette « sauvegarde ».
Voulez-vous changer l’étiquette de la partition « /dev/sdb3 » ? [O/n] n
Voulez-vous procéder au montage maintenant pour la partition « /dev/sdb3 » en y mettant pour étiquette « sauvegarde » ? [O/n] o
La partition « /dev/sdb3 » est déjà montée !
Voulez-vous démonter la partition « /dev/sdb3 » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « sauvegarde » ? [O/n] o
umount: /mnt/usb-Samsung_PSSD_T7_S5TKNJ0T202749K-0:0-part3 (/dev/sdb3) démonté
rmdir: suppression du répertoire, '/mnt/usb-Samsung_PSSD_T7_S5TKNJ0T202749K-0:0-part3'
-----------------------------------------------------------------
Script pour montage de partition de données terminé avec succès !
Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/sauvegarde/olivier-sauvegarde ».
Première passe , tout fonctionne RAS
$ lsblk -fe7
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
sda
└─sda1 ext4 1.0 backup 7c9e2ffb-88e4-4c01-99fe-18538b4a50cc 340,2G 22% /media/olivier/backup
sdb
├─sdb1 exfat 1.0 Ventoy A38B-994C 54,4G 17% /media/olivier/Ventoy
├─sdb2 vfat FAT16 VTOYEFI 223C-F3F8
└─sdb3 ntfs sauvegarde 2A8B81087147EA94 399,9G 0% /media/sauvegarde
nvme0n1
├─nvme0n1p1
├─nvme0n1p2 ntfs 8EB48053B4804027
├─nvme0n1p3 ntfs 6A0E1D830E1D4989
├─nvme0n1p4 vfat FAT32 2DE7-61A9 559,3M 7% /boot/efi
└─nvme0n1p5 ext4 1.0 b7458ee0-9d67-4c1e-9f95-c94fd4c2e8d6 555,6G 13% /
Hors ligne
#230 Le 18/04/2025, à 09:32
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
Salut @tycoon .
le script est approprié pour des montages de partition de disque interne .
en NTFS , l ' option " nofail " est incorporé au fstab . mais bon , c' est pas l' ideal , car il n ' y a pas de delai avec une option specifique qui , elle n' est pas incorporée dans les options .
d' ailleurs , il faudrait aussi modifier , les options de montage pour le format ext4 dans le cas de support externe .
il faut donc retravailler les options de montage dans le cas où il s' agit de partition externe .
En redémarrant et si ton disque externe n ' est pas connecté , que se passe t ' il ?
@nany , mon dossier /mnt n ' a pas été supprimé , vu qu ' il n' est pas vide .
Dernière modification par iznobe (Le 18/04/2025, à 09:46)
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#231 Le 18/04/2025, à 10:27
- tycooon
Re : [ SCRIPT ] pour montage automatique partitions internes
le disque enlevé , le boot se passe sans problème , juste un message d'erreur qui est normal, puisque le disque externe est absent, ce qui est sans conséquence sur le fonctionnement du PC.
Et le boot est aussi rapide avec ou sans disque.
$ journalctl --no-pager -b -p err
-------------------------------------------etc
avril 18 10:15:57 olivier-LarkBox-X systemd[1]: Timed out waiting for device dev-disk-by\x2dlabel-sauvegarde.device - /dev/disk/by-label/sauvegarde.
Hors ligne
#232 Le 18/04/2025, à 10:34
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
ok , merci pour l' info .
j ' ajusterai ce soir , en rentrant chez moi , les options de la ligne fstab poir les 2 formats , dans le cas de partition externe .
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#233 Le 18/04/2025, à 13:49
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
ajout des options au lignes de fstab : " ,nofail,x-systemd.device-timeout=1 "
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#234 Le 18/04/2025, à 16:51
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
Bonjour,
Eh oui, j’avais eu le temps de voir le message #227 (ou iznobe décrivait un test avec une partition montée sur /mnt) avant qu’il ne soit édité. Donc,
@nany , mon dossier /mnt n ' a pas été supprimé , vu qu ' il n' est pas vide .
Certes, mais dans la majorité des cas il est vide. Ma remarque tiens toujours et j’ai poussé la réflexion un peu plus loin : il ne faudrait pas lister a minima les partitions éventuellement montées sur des points de montage proposés lors de l’installation avec partitionnement manuel (/, /boot, /home, /tmp, /usr, /var, /srv, /opt et /usr/local).
Je propose donc de remplacer les lignes 63 à 90 :
$(lsblk -no path,label,fstype |
awk -vi=-1 'BEGIN { print "declare -A ListPart" } \
$NF ~ "ext|ntfs" \
{
j=0 ;
if ($2 ~ /^ext[2-4]$/ || $2 ~ /^ntfs$/)
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]=""\nListPart["i","++j"]="$2 }
else
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]="$2"\nListPart["i","++j"]="$3 }
}')
nbDev=$(( "${#ListPart[@]}"/3 ))
for (( n=0; n<nbDev; n++ )); do
echo "$(( n+1 )) ⇒ ${ListPart[$n,0]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
done
while [ -z "$PartNum" ]; do
read -rp "Choisissez le numéro correspondant à votre future partition de données : " PartNum
if [[ ! "$PartNum" =~ ^[1-9][0-9]*$ ]] || ! (( PartNum > 0 && PartNum <= nbDev )); then
echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
unset PartNum
fi
done
Part="${ListPart[$(( PartNum-1 )),0]}"
PartLabel="${ListPart[$(( PartNum-1 )),1]}"
PartFstype="${ListPart[$(( PartNum-1 )),2]}"
par :
$(lsblk -no path,fstype,mountpoint,label |
awk -vi=-1 'BEGIN { print "declare -A ListPart" } \
$2 ~ "ext|ntfs" \
{
j=0 ;
if ($3 ~ /^\/$|^\/boot$|^\/home$|^\/tmp$|^\/usr$|^\/var$|^\/srv$|^\/opt$|^\/usr\/local$/)
{ next }
else
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]="$2"\nListPart["i","++j"]="$3"\nListPart["i","++j"]="$4 }
}')
if [ "${#ListPart[@]}" == "0" ]; then
echo "Il n’y a pas de partition susceptible d’être montée."
exit 8
fi
nbDev=$(( "${#ListPart[@]}"/4 ))
echo
echo "n° ⇒ path label fstype mountpoint"
echo "----------------------------------------"
for (( n=0; n<nbDev; n++ )); do
echo "$(( n+1 )) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
done
echo
while [ -z "$PartNum" ]; do
read -rp "Choisissez le numéro correspondant à votre future partition de données : " PartNum
if [[ ! "$PartNum" =~ ^[1-9][0-9]*$ ]] || ! (( PartNum > 0 && PartNum <= nbDev )); then
echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
unset PartNum
fi
done
Part="${ListPart[$(( PartNum-1 )),0]}"
PartLabel="${ListPart[$(( PartNum-1 )),3]}"
PartFstype="${ListPart[$(( PartNum-1 )),1]}"
(J’ai changé l’ordre dans lsblk pour faciliter les tests.)
J’ai testé cette partie de code.
Il faudrait tester son intégration dans le script notamment pour des points de montage multiples et et des répertoires « sensibles » comme points de montage.
En ligne
#235 Le 18/04/2025, à 17:30
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
ouarf , c' est ce que j' avais tenté de faire à un moment donné mais c' était un poil complexe ... trop pour moi .
je viens de tester rapidement , ca fonctionne .
il me semble cependant que tu as oublié un pipe dans la fin de ( entre usr et local ) :
if ($3 ~ /^\/$|^\/boot$|^\/home$|^\/tmp$|^\/usr$|^\/var$|^\/srv$|^\/opt$|^\/usr\/local$/)
Par contre , pour le " rmdir " , il faut que je reconstruise la même regex , c' est un peu dommage ...
on ne pourrait pas définir cette regex en dehors du lsblk ( ou bien la recuperer , si c' est possible ? ) pour s ' en rerservir ensuite ?
il va falloir faire quelquechose dans le genre de :
$rgx_no_rmdir=^/$|^/boot$|^/home|^/tmp|^/usr$|^/var$|^/srv$|^/opt$|^/usr/|local$/
if ! $pmp =~ $rgx_no_rmdir
rmdir -v "$pmp"
code ci dessus non testé , ecrit ça là direct ...
Dernière modification par iznobe (Le 18/04/2025, à 17:40)
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#236 Le 18/04/2025, à 17:38
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
il me semble cependant que tu as oublié un pipe dans la fin de ( entre usr et local ) :
nany a écrit :if ($3 ~ /^\/$|^\/boot$|^\/home$|^\/tmp$|^\/usr$|^\/var$|^\/srv$|^\/opt$|^\/usr\/local$/)
Non, non, c’est bien /usr/local qui doit être recherché.
En ligne
#237 Le 18/04/2025, à 17:51
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
gawk -v nomVar='^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$' '...if ($3 ~ nomVar)...
?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#238 Le 18/04/2025, à 18:09
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
@nany , autant pour moi
@watael , je teste ça .
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#239 Le 18/04/2025, à 18:17
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
gawk -v nomVar='^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$' '...if ($3 ~ nomVar)...
?
rooo la boulette de debutant manque le " $ "
if ($3 ~ $nomVar)
loool , merci @watael
voilà ce que ça donne :
#!/bin/bash
# ----------------------------------------------------------------------------
# "LICENCE BEERWARE" (Révision 42):
# <iznobe@forum.ubuntu-fr.org> a créé ce fichier. Tant que vous conservez cet avertissement,
# vous pouvez faire ce que vous voulez de ce truc. Si on se rencontre un jour et
# que vous pensez que ce truc vaut le coup, vous pouvez me payer une bière en
# retour.
# ----------------------------------------------------------------------------
label() {
local rgx="[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-]"
while [ -z "$Label" ]; do
read -rp "Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères : " Label
if [[ "$Label" =~ $rgx || "${#Label}" -gt 16 ]]; then
echo "Le nom de votre étiquette comporte une espace, un accent ou un caractère spécial ou plus de 16 caractères !"
unset Label
fi
done
for (( n=0; n<"$nbDev"; n++ )); do
if [[ $Label == "${ListPart[$n,1]}" ]]; then
echo "Erreur, votre étiquette « $Label » est déjà attribuée !"
exit 4
fi
done
}
unmount() {
while [ -z "$rep3" ]; do
read -rp "Voulez-vous démonter la partition « $Part » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « $Label » ? [O/n] " Rep3
case "$Rep3" in
N|n)
echo "Annulation par l’utilisateur !"
exit 1
;;
Y|y|O|o|"")
PartMountPoints=( $(grep "$Part" /etc/mtab | cut -d " " -f 2) )
for pmp in "${PartMountPoints[@]}"; do
umount -v "$pmp"
if ! [[ "$pmp" =~ $nomVar ]]; then
rmdir -v "$pmp"
fi
numLines=( $(grep -n "$pmp" /etc/fstab | cut -d ":" -f 1 | sort -rn) )
for n in "${numLines[@]}"; do
sed -i "${n}d" /etc/fstab
done
done
sleep 1 # prise en compte du montage par le dash , sans delai , parfois la partition ne s' affiche pas .
unset Rep3
break
;;
*)
unset Rep3
;;
esac
done
}
if ((UID)); then
echo "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo »)"
exit 0
fi
gawk -v nomVar='^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$'
$(lsblk -no path,fstype,mountpoint,label |
awk -vi=-1 'BEGIN { print "declare -A ListPart" } \
$2 ~ "ext|ntfs" \
{
j=0 ;
if ($3 ~ $nomVar)
{ next }
else
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]="$2"\nListPart["i","++j"]="$3"\nListPart["i","++j"]="$4 }
}')
if [ "${#ListPart[@]}" == "0" ]; then
echo "Il n’y a pas de partition susceptible d’être montée."
exit 8
fi
nbDev=$(( "${#ListPart[@]}"/4 ))
echo
echo "n° ⇒ path label fstype mountpoint"
echo "----------------------------------------"
for (( n=0; n<nbDev; n++ )); do
echo "$(( n+1 )) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
done
echo
while [ -z "$PartNum" ]; do
read -rp "Choisissez le numéro correspondant à votre future partition de données : " PartNum
if [[ ! "$PartNum" =~ ^[1-9][0-9]*$ ]] || ! (( PartNum > 0 && PartNum <= nbDev )); then
echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
unset PartNum
fi
done
Part="${ListPart[$(( PartNum-1 )),0]}"
PartLabel="${ListPart[$(( PartNum-1 )),3]}"
PartFstype="${ListPart[$(( PartNum-1 )),1]}"
if [[ -z "$PartLabel" ]]; then
echo "La partition « $Part » n’a pas d’étiquette."
label
else
echo "La partition « $Part » a l’étiquette « $PartLabel »."
while [ -z "$Rep" ]; do
read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] " Rep
case "$Rep" in
N|n)
Label="$PartLabel"
unset Rep
break
;;
Y|y|O|o|"")
label
unset Rep
break
;;
*)
unset Rep
;;
esac
done
fi
while [ -z "$Rep2" ]; do
read -rp "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $Label » ? [O/n] " Rep2
case "$Rep2" in
N|n)
echo "Annulation par l’utilisateur !"
unset Rep2
exit 1
;;
Y|y|O|o|"")
if grep -q "$(lsblk -no uuid "$Part")" /etc/fstab; then
echo "L’UUID de la partition est déjà présent dans le fstab !"
unmount
elif grep -Eq "(LABEL=|by-label/)$Label" /etc/fstab; then
echo "L’étiquette « $Label » est déjà utilisée dans le fstab !"
unmount
elif grep -q "^$Part" /etc/mtab; then
echo "La partition « $Part » est déjà montée !"
unmount
fi
# construction des éléments :
if [[ "$PartFstype" =~ ext[2-4] ]]; then
e2label "$Part" "$Label"
echo "LABEL=$Label /media/$Label $PartFstype defaults,nofail,x-systemd.device-timeout=1" >> /etc/fstab
elif [[ "$PartFstype" == "ntfs" ]]; then
ntfslabel "$Part" "$Label"
echo "LABEL=$Label /media/$Label ntfs3 defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
fi
mkdir /media/"$Label" 2>/dev/null
systemctl daemon-reload
mount -a 2>/dev/null
mkdir /media/"$Label"/"$SUDO_USER"-"$Label" 2>/dev/null
chown "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label" 2>/dev/null
mkdir /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null
chown "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null
chmod 700 /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null
if [ -e /media/"$Label"/.Trash-"$SUDO_UID" ]; then
echo "-----------------------------------------------------------------"
echo "Script pour montage de partition de données terminé avec succès !"
echo ""
echo "Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/$Label/$SUDO_USER-$Label »."
else
echo "erreur inconnue !"
exit 10
fi
unset Rep2
break
;;
*)
unset Rep2
;;
esac
done
j ' approfondi les tests .
part nvme0n1p12 montée sur mount et un autre via le script :
mount: /media/yiiut (/dev/nvme0n1p12) démonté
umount: /mnt démonté
-----------------------------------------------------------------
Script pour montage de partition de données terminé avec succès !
Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/ptit-louis/iznobe-ptit-louis ».
iznobe@iznobe-pc:~/Scripts$
par contre , il n ' a pas " rmdir " /media/yiiut ... j ' ai du faire une boulette
je creuse .
Dernière modification par iznobe (Le 18/04/2025, à 18:27)
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#240 Le 18/04/2025, à 18:29
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
non, non. il ne manque pas de $ : hormis les "paramètres positionnels" ($0, $1...), les variables awk (NF, NFR..., ainsi que les variables définies par l'utilisateur) n'en ont pas.
Dernière modification par Watael (Le 18/04/2025, à 18:31)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#241 Le 18/04/2025, à 18:47
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
Avec :
gawk -v nomVar='^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$'
$(lsblk -no path,fstype,mountpoint,label |
awk -vi=-1 'BEGIN { print "declare -A ListPart" } \
$2 ~ "ext|ntfs" \
{
j=0 ;
if ($3 ~ nomVar) # sans le " $ " #####################################
{ next }
else
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]="$2"\nListPart["i","++j"]="$3"\nListPart["i","++j"]="$4 }
}')
if [ "${#ListPart[@]}" == "0" ]; then
echo "Il n’y a pas de partition susceptible d’être montée."
exit 8
fi
nbDev=$(( "${#ListPart[@]}"/4 ))
echo
echo "n° ⇒ path label fstype mountpoint"
echo "----------------------------------------"
for (( n=0; n<nbDev; n++ )); do
echo "$(( n+1 )) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
done
echo
while [ -z "$PartNum" ]; do
read -rp "Choisissez le numéro correspondant à votre future partition de données : " PartNum
if [[ ! "$PartNum" =~ ^[1-9][0-9]*$ ]] || ! (( PartNum > 0 && PartNum <= nbDev )); then
echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
unset PartNum
fi
done
Part="${ListPart[$(( PartNum-1 )),0]}"
PartLabel="${ListPart[$(( PartNum-1 )),3]}"
PartFstype="${ListPart[$(( PartNum-1 )),1]}"
j ' obtiens :
iznobe@iznobe-pc:~/Scripts$ sudo bash automount_part_data.sh
Utilisation : gawk [options GNU ou POSIX] -f fichier_prog [--] fichier ...
Utilisation : gawk [options GNU ou POSIX] [--] 'programme' fichier ...
Options POSIX : Options longues GNU : (standard)
-f fichier_prog --file=fichier_prog
-F fs --field-separator=fs
-v var=valeur --assign=var=valeur
Options POSIX : Options longues GNU : (extensions)
-b --characters-as-bytes
-c --traditional
-C --copyright
-d[fichier] --dump-variables[=fichier]
-D[fichier] --debug[=fichier]
-e 'programme' --source='programme'
-E fichier --exec=fichier
-g --gen-pot
-h --help
-i fichier --include=fichier
-I --trace
-l bibliothèque --load=bibliothèque
-L[fatal|invalid|no-ext] --lint[=fatal|invalid|no-ext]
-M --bignum
-N --use-lc-numeric
-n --non-decimal-data
-o[fichier] --pretty-print[=fichier]
-O --optimize
-p[fichier] --profile[=fichier]
-P --posix
-r --re-interval
-s --no-optimize
-S --sandbox
-t --lint-old
-V --version
Pour signaler une anomalie, utilisez le programme « gawkbug ».
Pour des instructions complètes, consultez le nœud « Bugs » de
« gawk.info », qui est dans la section « Reporting Problems and Bugs »
de la version imprimée. Vous trouverez les mêmes informations sur
https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.
MERCI de ne PAS essayer de signaler une anomalie via comp.lang.awk,
ou en utilisant un forum internet tel que Stack Overflow.
Pour signaler une erreur de traduction, envoyez un message à
traduction-gawk@tigreraye.org.
gawk est un langage de recherche et de traitement des motifs.
Par défaut, il lit l'entrée standard et écrit sur la sortie standard.
Exemples :
gawk '{ somme += $1 }; END { print somme }' fichier
gawk -F: '{ print $1 }' /etc/passwd
Il n’y a pas de partition susceptible d’être montée.
iznobe@iznobe-pc:~/Scripts$
Alors qu ' avec le " $ " , pas d' erreur , mais ca ne fonctionne pas pour autant puisque ' / ' racine est proposée dans la liste des partition possibles à traiter .
Dernière modification par iznobe (Le 18/04/2025, à 19:02)
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#242 Le 18/04/2025, à 19:51
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
#!/bin/bash
# ----------------------------------------------------------------------------
# "LICENCE BEERWARE" (Révision 42):
# <iznobe@forum.ubuntu-fr.org> a créé ce fichier. Tant que vous conservez cet avertissement,
# vous pouvez faire ce que vous voulez de ce truc. Si on se rencontre un jour et
# que vous pensez que ce truc vaut le coup, vous pouvez me payer une bière en
# retour.
# ----------------------------------------------------------------------------
label() {
local rgx="[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-]"
while [ -z "$Label" ]; do
read -rp "Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères : " Label
if [[ "$Label" =~ $rgx || "${#Label}" -gt 16 ]]; then
echo "Le nom de votre étiquette comporte une espace, un accent ou un caractère spécial ou plus de 16 caractères !"
unset Label
fi
done
for (( n=0; n<"$nbDev"; n++ )); do
if [[ $Label == "${ListPart[$n,1]}" ]]; then
echo "Erreur, votre étiquette « $Label » est déjà attribuée !"
exit 4
fi
done
}
unmount() {
local rgx='^(/|/mnt|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$'
while [ -z "$rep3" ]; do
read -rp "Voulez-vous démonter la partition « $Part » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « $Label » ? [O/n] " Rep3
case "$Rep3" in
N|n)
echo "Annulation par l’utilisateur !"
unset Rep3
exit 1
;;
Y|y|O|o|"")
PartMountPoints=( $(grep "$Part" /etc/mtab | cut -d " " -f 2) )
for pmp in "${PartMountPoints[@]}"; do
umount -v "$pmp"
if ! [[ "$pmp" =~ $rgx ]]; then
rmdir -v "$pmp"
fi
numLines=( $(grep -n "$pmp" /etc/fstab | cut -d ":" -f 1 | sort -rn) )
for n in "${numLines[@]}"; do
sed -i "${n}d" /etc/fstab
done
done
sleep 1 # prise en compte du montage par le dash , sans delai , parfois la partition ne s' affiche pas .
unset Rep3
break
;;
*)
unset Rep3
;;
esac
done
}
if ((UID)); then
echo "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo »)"
exit 0
fi
gawk -v nomVar='^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$'
$(lsblk -no path,fstype,mountpoint,label |
awk -vi=-1 'BEGIN { print "declare -A ListPart" } \
$2 ~ "ext|ntfs" \
{
j=0 ;
if ($3 ~ /^\/$|^\/boot$|^\/home$|^\/tmp$|^\/usr$|^\/var$|^\/srv$|^\/opt$|^\/usr\/local$/)
{ next }
else
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]="$2"\nListPart["i","++j"]="$3"\nListPart["i","++j"]="$4 }
}')
if [ "${#ListPart[@]}" == "0" ]; then
echo "Il n’y a pas de partition susceptible d’être montée."
exit 8
fi
nbDev=$(( "${#ListPart[@]}"/4 ))
echo
echo "n° ⇒ path label fstype mountpoint"
echo "----------------------------------------"
for (( n=0; n<nbDev; n++ )); do
echo "$(( n+1 )) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
done
echo
while [ -z "$PartNum" ]; do
read -rp "Choisissez le numéro correspondant à votre future partition de données : " PartNum
if [[ ! "$PartNum" =~ ^[1-9][0-9]*$ ]] || ! (( PartNum > 0 && PartNum <= nbDev )); then
echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
unset PartNum
fi
done
Part="${ListPart[$(( PartNum-1 )),0]}"
PartLabel="${ListPart[$(( PartNum-1 )),3]}"
PartFstype="${ListPart[$(( PartNum-1 )),1]}"
if [[ -z "$PartLabel" ]]; then
echo "La partition « $Part » n’a pas d’étiquette."
label
else
echo "La partition « $Part » a l’étiquette « $PartLabel »."
while [ -z "$Rep" ]; do
read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] " Rep
case "$Rep" in
N|n)
Label="$PartLabel"
unset Rep
break
;;
Y|y|O|o|"")
label
unset Rep
break
;;
*)
unset Rep
;;
esac
done
fi
while [ -z "$Rep2" ]; do
read -rp "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $Label » ? [O/n] " Rep2
case "$Rep2" in
N|n)
echo "Annulation par l’utilisateur !"
unset Rep2
exit 1
;;
Y|y|O|o|"")
if grep -q "$(lsblk -no uuid "$Part")" /etc/fstab; then
echo "L’UUID de la partition est déjà présent dans le fstab !"
unmount
elif grep -Eq "(LABEL=|by-label/)$Label" /etc/fstab; then
echo "L’étiquette « $Label » est déjà utilisée dans le fstab !"
unmount
elif grep -q "^$Part" /etc/mtab; then
echo "La partition « $Part » est déjà montée !"
unmount
fi
# construction des éléments :
if [[ "$PartFstype" =~ ext[2-4] ]]; then
e2label "$Part" "$Label"
echo "LABEL=$Label /media/$Label $PartFstype defaults,nofail,x-systemd.device-timeout=1" >> /etc/fstab
elif [[ "$PartFstype" == "ntfs" ]]; then
ntfslabel "$Part" "$Label"
echo "LABEL=$Label /media/$Label ntfs3 defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
fi
mkdir /media/"$Label" 2>/dev/null
systemctl daemon-reload
mount -a 2>/dev/null
mkdir /media/"$Label"/"$SUDO_USER"-"$Label" 2>/dev/null
chown "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label" 2>/dev/null
mkdir /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null
chown "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null
chmod 700 /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null
if [ -e /media/"$Label"/.Trash-"$SUDO_UID" ]; then
echo "-----------------------------------------------------------------"
echo "Script pour montage de partition de données terminé avec succès !"
echo ""
echo "Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/$Label/$SUDO_USER-$Label »."
else
echo "erreur inconnue !"
exit 10
fi
unset Rep2
break
;;
*)
unset Rep2
;;
esac
done
en fait , il faut eviter de supprimer tous les repertoire de 1er niveau au minimum , enfin ceux par defaut : /bin , etc ...
il faut donc en faire la liste je supopose sur le meme principe que :
unmount() {
local rgx='^(/|/bin|/mnt|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$'
et touti cuenti , non ?
Dernière modification par iznobe (Le 18/04/2025, à 19:52)
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#243 Le 18/04/2025, à 20:18
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
je peux me moquer ? forcément que ça ne marche pas si tu le mets n'importe où. houuuu!
$(lsblk -no path,fstype,mountpoint,label \
|gawk -v nomVar='^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$' -v i=-1 'BEGIN { print "declare -A ListPart" }
...
if ($3 ~ nomVar)...
Dernière modification par Watael (Le 18/04/2025, à 20:22)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#244 Le 18/04/2025, à 20:32
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
Avec :
…
j ' obtiens :
…
Alors qu ' avec le " $ " , pas d' erreur , mais ca ne fonctionne pas pour autant puisque ' / ' racine est proposée dans la liste des partition possibles à traiter .
C’est parce que tu n’as pas compris le message #237 de Watael ; gawk n’est pas fait pour déclarer une variable à passer à awk, il était destiné à remplacer awk.
Bon, comme gawk n’est pas installé chez moi, je considère qu’il n’est pas installé par défaut et je continue avec awk.
Donc, tu commences par déclarer ta variable en début de script :
rgx_no_rmdir="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$"
Ensuite tu déclares une variable dans awk qui prend la valeur de la variable déclarée ci-dessus et tu l’utilises dans le if :
$(lsblk -no path,fstype,mountpoint,label |
awk -v i=-1 -v re="$rgx_no_rmdir" \
'BEGIN { print "declare -A ListPart" } \
$2 ~ "ext|ntfs" \
{
j=0 ;
if ($3 ~ re)
{ next }
else
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]="$2"\nListPart["i","++j"]="$3"\nListPart["i","++j"]="$4 }
}')
Puis, dans la fonction unmount, tu récupères la variable déclarée au début pour traiter la suppression ou non :
if ! [[ "$pmp" =~ $rgx_no_rmdir ]]; then
rmdir -v "$pmp"
else
echo "$pmp n’a pas été supprimé."
fi
Le script au complet après ces modifications :
#!/bin/bash
# ----------------------------------------------------------------------------
# "LICENCE BEERWARE" (Révision 42):
# <iznobe@forum.ubuntu-fr.org> a créé ce fichier. Tant que vous conservez cet avertissement,
# vous pouvez faire ce que vous voulez de ce truc. Si on se rencontre un jour et
# que vous pensez que ce truc vaut le coup, vous pouvez me payer une bière en
# retour.
# ----------------------------------------------------------------------------
rgx_no_rmdir="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$"
label() {
local rgx="[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-]"
while [ -z "$Label" ]; do
read -rp "Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères : " Label
if [[ "$Label" =~ $rgx || "${#Label}" -gt 16 ]]; then
echo "Le nom de votre étiquette comporte une espace, un accent ou un caractère spécial ou plus de 16 caractères !"
unset Label
fi
done
for (( n=0; n<"$nbDev"; n++ )); do
if [[ $Label == "${ListPart[$n,1]}" ]]; then
echo "Erreur, votre étiquette « $Label » est déjà attribuée !"
exit 4
fi
done
}
unmount() {
while [ -z "$rep3" ]; do
read -rp "Voulez-vous démonter la partition « $Part » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « $Label » ? [O/n] " Rep3
case "$Rep3" in
N|n)
echo "Annulation par l’utilisateur !"
unset Rep3
exit 0
;;
Y|y|O|o|"")
PartMountPoints=( $(grep "$Part" /etc/mtab | cut -d " " -f 2) )
for pmp in "${PartMountPoints[@]}"; do
umount -v "$pmp"
if ! [[ "$pmp" =~ $rgx_no_rmdir ]]; then
rmdir -v "$pmp"
else
echo "$pmp n’a pas été supprimé."
fi
numLines=( $(grep -n "$pmp" /etc/fstab | cut -d ":" -f 1 | sort -rn) )
for n in "${numLines[@]}"; do
sed -i "${n}d" /etc/fstab
done
done
sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
unset Rep3
break
;;
*)
unset Rep3
;;
esac
done
}
if ((UID)); then
echo "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo »)"
exit 1
fi
$(lsblk -no path,fstype,mountpoint,label |
awk -v i=-1 -v re="$rgx_no_rmdir" \
'BEGIN { print "declare -A ListPart" } \
$2 ~ "ext|ntfs" \
{
j=0 ;
if ($3 ~ re)
{ next }
else
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]="$2"\nListPart["i","++j"]="$3"\nListPart["i","++j"]="$4 }
}')
if [ "${#ListPart[@]}" == "0" ]; then
echo "Il n’y a pas de partition susceptible d’être montée."
exit 8
fi
nbDev=$(( "${#ListPart[@]}"/4 ))
echo
echo "n° ⇒ path label fstype mountpoint"
echo "----------------------------------------"
for (( n=0; n<nbDev; n++ )); do
echo "$(( n+1 )) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
done
echo
while [ -z "$PartNum" ]; do
read -rp "Choisissez le numéro correspondant à votre future partition de données : " PartNum
if [[ ! "$PartNum" =~ ^[1-9][0-9]*$ ]] || ! (( PartNum > 0 && PartNum <= nbDev )); then
echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
unset PartNum
fi
done
Part="${ListPart[$(( PartNum-1 )),0]}"
PartLabel="${ListPart[$(( PartNum-1 )),3]}"
PartFstype="${ListPart[$(( PartNum-1 )),1]}"
if [[ -z "$PartLabel" ]]; then
echo "La partition « $Part » n’a pas d’étiquette."
label
else
echo "La partition « $Part » a l’étiquette « $PartLabel »."
while [ -z "$Rep" ]; do
read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] " Rep
case "$Rep" in
N|n)
Label="$PartLabel"
unset Rep
break
;;
Y|y|O|o|"")
label
unset Rep
break
;;
*)
unset Rep
;;
esac
done
fi
while [ -z "$Rep2" ]; do
read -rp "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $Label » ? [O/n] " Rep2
case "$Rep2" in
N|n)
echo "Annulation par l’utilisateur !"
unset Rep2
exit 1
;;
Y|y|O|o|"")
if grep -q "$(lsblk -no uuid "$Part")" /etc/fstab; then
echo "L’UUID de la partition est déjà présent dans le fstab !"
unmount
elif grep -Eq "(LABEL=|by-label/)$Label" /etc/fstab; then
echo "L’étiquette « $Label » est déjà utilisée dans le fstab !"
unmount
elif grep -q "^$Part" /etc/mtab; then
echo "La partition « $Part » est déjà montée !"
unmount
fi
# construction des éléments :
if [[ "$PartFstype" =~ ext[2-4] ]]; then
e2label "$Part" "$Label"
echo "LABEL=$Label /media/$Label $PartFstype defaults,nofail,x-systemd.device-timeout=1" >> /etc/fstab
elif [[ "$PartFstype" == "ntfs" ]]; then
ntfslabel "$Part" "$Label"
echo "LABEL=$Label /media/$Label ntfs3 defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
fi
mkdir /media/"$Label" 2>/dev/null
systemctl daemon-reload
mount -a 2>/dev/null
mkdir /media/"$Label"/"$SUDO_USER"-"$Label" 2>/dev/null
chown "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label" 2>/dev/null
mkdir /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null
chown "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null
chmod 700 /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null
if [ -e /media/"$Label"/.Trash-"$SUDO_UID" ]; then
echo "-----------------------------------------------------------------"
echo "Script pour montage de partition de données terminé avec succès !"
echo ""
echo "Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/$Label/$SUDO_USER-$Label »."
else
echo "erreur inconnue !"
exit 10
fi
unset Rep2
break
;;
*)
unset Rep2
;;
esac
done
Grilled by Watael!
Dernière modification par nany (Le 19/04/2025, à 03:13)
En ligne
#245 Le 18/04/2025, à 20:44
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
sauf que je n'ai pas vu que la regex était utilisée deux fois dans le script.
bien joué nany !
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#246 Le 18/04/2025, à 20:58
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
en fait , il faut eviter de supprimer tous les repertoire de 1er niveau au minimum , enfin ceux par defaut : /bin , etc ...
il faut donc en faire la liste je supopose sur le meme principe que :
…
et touti cuenti , non ?
J’ai énuméré les répertoires proposés lors de l’installation avec un partitionnement manuel mais libre à toi d’alimenter la variable avec d’autres répertoires que tu juges utile de protéger.
En ligne
#247 Le 18/04/2025, à 23:43
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
sauf que je n'ai pas vu que la regex était utilisée deux fois dans le script.
Au depart elle ne l' est pas , puisque @nany proposait de ne pas enumerer certains point de montage au choix de la liste des partitions a traiter .
Mais il n' empêche que si une partition est montée d' une autre manière sur un répertoire ( comme dans l ' exemple que j' ai supprimé ) , /mnt ou /media ou n' importe quel autre d' ailleurs , alors ce répertoire sera supprimé dans cette partie de code :
PartMountPoints=( $(grep "$Part" /etc/mtab | cut -d " " -f 2) )
for pmp in "${PartMountPoints[@]}"; do
umount -v "$pmp"
rmdir -v "$pmp"
numLines=( $(grep -n "$pmp" /etc/fstab | cut -d ":" -f 1 | sort -rn) )
for n in "${numLines[@]}"; do
sed -i "${n}d" /etc/fstab
done
done
Donc , 2 possibilités , soit on traite les conditions pour " rmdir " separément , comme j ' ai ( presque ) fait dans mon dernier script ,
soit on fait une variable que l' on utilise pour eviter d' enumerer et qui ressert aussi pour les conditions du " rmdir " .
je regarderai plus en detail le code de @nany , car j' ai du mal a modifier toute la partie suivante ( même si je comprends ce que cela fait ):
$(lsblk -no path,fstype,mountpoint,label |
awk -vi=-1 'BEGIN { print "declare -A ListPart" } \
$2 ~ "ext|ntfs" \
{
j=0 ;
if ($3 ~ /^\/$|^\/boot$|^\/home$|^\/tmp$|^\/usr$|^\/var$|^\/srv$|^\/opt$|^\/usr\/local$/)
{ next }
else
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]="$2"\nListPart["i","++j"]="$3"\nListPart["i","++j"]="$4 }
}')
Et pour rappel , je ne maîtrise absolument pas bash ni même la moitié des commandes ... je suis un débutant dans le domaine , je me cantonne a des choses basiques ( un petit peu de sed , mais pas du tout awk ou cousins ni plein d' autres )
Dernière modification par iznobe (Le 18/04/2025, à 23:46)
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#248 Le 19/04/2025, à 06:05
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
Bonjour,
je regarderai plus en detail le code de @nany , car j' ai du mal a modifier toute la partie suivante ( même si je comprends ce que cela fait ):
$(lsblk -no path,fstype,mountpoint,label | awk -vi=-1 'BEGIN { print "declare -A ListPart" } \ $2 ~ "ext|ntfs" \ { j=0 ; if ($3 ~ /^\/$|^\/boot$|^\/home$|^\/tmp$|^\/usr$|^\/var$|^\/srv$|^\/opt$|^\/usr\/local$/) { next } else { print "ListPart["++i","j"]="$1"\nListPart["i","++j"]="$2"\nListPart["i","++j"]="$3"\nListPart["i","++j"]="$4 } }')
Bah je pense avoir assez bien détaillé le truc, non ?
Tiens, d’ailleurs, en relisant ce bout de code, je me rends compte que le changement d’ordre de lsblk et le test avec l’expression régulière rendent la variable j inutile.
On peut donc mettre :
$(lsblk -no path,fstype,mountpoint,label |
awk -v i=-1 -v re="$rgx_no_rmdir" \
'BEGIN { print "declare -A ListPart" }
$2 ~ "ext|ntfs" \
{
if ($3 ~ re)
{ next }
else
{ print "ListPart["++i",0]="$1"\nListPart["i",1]="$2"\nListPart["i",2]="$3"\nListPart["i",3]="$4 }
}')
Et, du coup, je remets le script complet modifié :
#!/bin/bash
# ----------------------------------------------------------------------------
# "LICENCE BEERWARE" (Révision 42):
# <iznobe@forum.ubuntu-fr.org> a créé ce fichier. Tant que vous conservez cet avertissement,
# vous pouvez faire ce que vous voulez de ce truc. Si on se rencontre un jour et
# que vous pensez que ce truc vaut le coup, vous pouvez me payer une bière en
# retour.
# ----------------------------------------------------------------------------
rgx_no_rmdir="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$"
label() {
local rgx="[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-]"
while [ -z "$Label" ]; do
read -rp "Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères : " Label
if [[ "$Label" =~ $rgx || "${#Label}" -gt 16 ]]; then
echo "Le nom de votre étiquette comporte une espace, un accent ou un caractère spécial ou plus de 16 caractères !"
unset Label
fi
done
for (( n=0; n<"$nbDev"; n++ )); do
if [[ $Label == "${ListPart[$n,3]}" ]]; then
echo "Erreur, votre étiquette « $Label » est déjà attribuée !"
exit 4
fi
done
}
unmount() {
while [ -z "$rep3" ]; do
read -rp "Voulez-vous démonter la partition « $Part » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « $Label » ? [O/n] " Rep3
case "$Rep3" in
N|n)
echo "Annulation par l’utilisateur !"
unset Rep3
exit 0
;;
Y|y|O|o|"")
PartMountPoints=( $(grep "$Part" /etc/mtab | cut -d " " -f 2) )
for pmp in "${PartMountPoints[@]}"; do
umount -v "$pmp"
if ! [[ "$pmp" =~ $rgx_no_rmdir ]]; then
rmdir -v "$pmp"
else
echo "$pmp n’a pas été supprimé."
fi
numLines=( $(grep -n "$pmp" /etc/fstab | cut -d ":" -f 1 | sort -rn) )
for n in "${numLines[@]}"; do
sed -i "${n}d" /etc/fstab
done
done
sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
unset Rep3
break
;;
*)
unset Rep3
;;
esac
done
}
if ((UID)); then
echo "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo »)"
exit 1
fi
$(lsblk -no path,fstype,mountpoint,label |
awk -v i=-1 -v re="$rgx_no_rmdir" \
'BEGIN { print "declare -A ListPart" }
$2 ~ "ext|ntfs" \
{
if ($3 ~ re)
{ next }
else
{ print "ListPart["++i",0]="$1"\nListPart["i",1]="$2"\nListPart["i",2]="$3"\nListPart["i",3]="$4 }
}')
if [ "${#ListPart[@]}" == "0" ]; then
echo "Il n’y a pas de partition susceptible d’être montée."
exit 8
fi
nbDev=$(("${#ListPart[@]}"/4))
echo
echo "n° ⇒ path label fstype mountpoint"
echo "----------------------------------------"
for (( n=0; n<nbDev; n++ )); do
echo "$((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
done
echo
while [ -z "$PartNum" ]; do
read -rp "Choisissez le numéro correspondant à votre future partition de données : " PartNum
if [[ ! "$PartNum" =~ ^[1-9][0-9]*$ ]] || ! (( PartNum > 0 && PartNum <= nbDev )); then
echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
unset PartNum
fi
done
Part="${ListPart[$((PartNum-1)),0]}"
PartLabel="${ListPart[$((PartNum-1)),3]}"
PartFstype="${ListPart[$((PartNum-1)),1]}"
if [[ -z "$PartLabel" ]]; then
echo "La partition « $Part » n’a pas d’étiquette."
label
else
echo "La partition « $Part » a l’étiquette « $PartLabel »."
while [ -z "$Rep" ]; do
read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] " Rep
case "$Rep" in
N|n)
Label="$PartLabel"
unset Rep
break
;;
Y|y|O|o|"")
label
unset Rep
break
;;
*)
unset Rep
;;
esac
done
fi
while [ -z "$Rep2" ]; do
read -rp "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $Label » ? [O/n] " Rep2
case "$Rep2" in
N|n)
echo "Annulation par l’utilisateur !"
unset Rep2
exit 0
;;
Y|y|O|o|"")
if grep -q "$(lsblk -no uuid "$Part")" /etc/fstab; then
echo "L’UUID de la partition est déjà présent dans le fstab !"
unmount
elif grep -Eq "(LABEL=|by-label/)$Label" /etc/fstab; then
echo "L’étiquette « $Label » est déjà utilisée dans le fstab !"
unmount
elif grep -q "^$Part" /etc/mtab; then
echo "La partition « $Part » est déjà montée !"
unmount
fi
# construction des éléments :
if [[ "$PartFstype" =~ ext[2-4] ]]; then
e2label "$Part" "$Label"
echo "LABEL=$Label /media/$Label $PartFstype defaults,nofail,x-systemd.device-timeout=1" >> /etc/fstab
elif [[ "$PartFstype" == "ntfs" ]]; then
ntfslabel "$Part" "$Label"
echo "LABEL=$Label /media/$Label ntfs3 defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
fi
mkdir /media/"$Label" 2>/dev/null
systemctl daemon-reload
mount -a 2>/dev/null
mkdir /media/"$Label"/"$SUDO_USER"-"$Label" 2>/dev/null
chown "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label" 2>/dev/null
mkdir /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null
chown "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null
chmod 700 /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null
if [ -e /media/"$Label"/.Trash-"$SUDO_UID" ]; then
echo "-----------------------------------------------------------------"
echo "Script pour montage de partition de données terminé avec succès !"
echo ""
echo "Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/$Label/$SUDO_USER-$Label »."
else
echo "erreur inconnue !"
exit 10
fi
unset Rep2
break
;;
*)
unset Rep2
;;
esac
done
À copier tel quel dans github et à tester en long, en large et en travers.
Dernière modification par nany (Le 19/04/2025, à 06:48)
En ligne
#249 Le 19/04/2025, à 07:08
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
Bonjour , en me levant , je me dis que c' est mieux de " rmdir " uniquement si on est dans "/media/" ou dans " /mnt " en fait non ?
Bah je pense avoir assez bien détaillé le truc, non ?
oui , tout à fait , j ' ai compris . mais je ne me sens pas de modifié sans grand peine .
Bref , du coup , si je ne me suis pas trompé dans la regex , ca donne ça :
#!/bin/bash
# ----------------------------------------------------------------------------
# "LICENCE BEERWARE" (Révision 42):
# <iznobe@forum.ubuntu-fr.org> a créé ce fichier. Tant que vous conservez cet avertissement,
# vous pouvez faire ce que vous voulez de ce truc. Si on se rencontre un jour et
# que vous pensez que ce truc vaut le coup, vous pouvez me payer une bière en
# retour.
# ----------------------------------------------------------------------------
rgx_no_list="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$"
label() {
local rgx="[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-]"
while [ -z "$Label" ]; do
read -rp "Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères : " Label
if [[ "$Label" =~ $rgx || "${#Label}" -gt 16 ]]; then
echo "Le nom de votre étiquette comporte une espace, un accent ou un caractère spécial ou plus de 16 caractères !"
unset Label
fi
done
for (( n=0; n<"$nbDev"; n++ )); do
if [[ $Label == "${ListPart[$n,3]}" ]]; then
echo "Erreur, votre étiquette « $Label » est déjà attribuée !"
exit 4
fi
done
}
unmount() {
local rgx='^(/mnt/|/media/)'
while [ -z "$rep3" ]; do
read -rp "Voulez-vous démonter la partition « $Part » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « $Label » ? [O/n] " Rep3
case "$Rep3" in
N|n)
echo "Annulation par l’utilisateur !"
unset Rep3
exit 0
;;
Y|y|O|o|"")
PartMountPoints=( $(grep "$Part" /etc/mtab | cut -d " " -f 2) )
for pmp in "${PartMountPoints[@]}"; do
umount -v "$pmp"
if [[ "$pmp" =~ $rgx ]]; then
rmdir -v "$pmp"
else
echo "$pmp n’a pas été supprimé."
fi
numLines=( $(grep -n "$pmp" /etc/fstab | cut -d ":" -f 1 | sort -rn) )
for n in "${numLines[@]}"; do
sed -i "${n}d" /etc/fstab
done
done
sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
unset Rep3
break
;;
*)
unset Rep3
;;
esac
done
}
if ((UID)); then
echo "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo »)"
exit 1
fi
$(lsblk -no path,fstype,mountpoint,label |
awk -v i=-1 -v re="$rgx_no_list" \
'BEGIN { print "declare -A ListPart" }
$2 ~ "ext|ntfs" \
{
if ($3 ~ re)
{ next }
else
{ print "ListPart["++i",0]="$1"\nListPart["i",1]="$2"\nListPart["i",2]="$3"\nListPart["i",3]="$4 }
}')
if [ "${#ListPart[@]}" == "0" ]; then
echo "Il n’y a pas de partition susceptible d’être montée."
exit 8
fi
nbDev=$(("${#ListPart[@]}"/4))
echo
echo "n° ⇒ path label fstype mountpoint"
echo "----------------------------------------"
for (( n=0; n<nbDev; n++ )); do
echo "$((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
done
echo
while [ -z "$PartNum" ]; do
read -rp "Choisissez le numéro correspondant à votre future partition de données : " PartNum
if [[ ! "$PartNum" =~ ^[1-9][0-9]*$ ]] || ! (( PartNum > 0 && PartNum <= nbDev )); then
echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
unset PartNum
fi
done
Part="${ListPart[$((PartNum-1)),0]}"
PartLabel="${ListPart[$((PartNum-1)),3]}"
PartFstype="${ListPart[$((PartNum-1)),1]}"
if [[ -z "$PartLabel" ]]; then
echo "La partition « $Part » n’a pas d’étiquette."
label
else
echo "La partition « $Part » a l’étiquette « $PartLabel »."
while [ -z "$Rep" ]; do
read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] " Rep
case "$Rep" in
N|n)
Label="$PartLabel"
unset Rep
break
;;
Y|y|O|o|"")
label
unset Rep
break
;;
*)
unset Rep
;;
esac
done
fi
while [ -z "$Rep2" ]; do
read -rp "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $Label » ? [O/n] " Rep2
case "$Rep2" in
N|n)
echo "Annulation par l’utilisateur !"
unset Rep2
exit 0
;;
Y|y|O|o|"")
if grep -q "$(lsblk -no uuid "$Part")" /etc/fstab; then
echo "L’UUID de la partition est déjà présent dans le fstab !"
unmount
elif grep -Eq "(LABEL=|by-label/)$Label" /etc/fstab; then
echo "L’étiquette « $Label » est déjà utilisée dans le fstab !"
unmount
elif grep -q "^$Part" /etc/mtab; then
echo "La partition « $Part » est déjà montée !"
unmount
fi
# construction des éléments :
if [[ "$PartFstype" =~ ext[2-4] ]]; then
e2label "$Part" "$Label"
echo "LABEL=$Label /media/$Label $PartFstype defaults,nofail,x-systemd.device-timeout=1" >> /etc/fstab
elif [[ "$PartFstype" == "ntfs" ]]; then
ntfslabel "$Part" "$Label"
echo "LABEL=$Label /media/$Label ntfs3 defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
fi
mkdir /media/"$Label" 2>/dev/null
systemctl daemon-reload
mount -a 2>/dev/null
mkdir /media/"$Label"/"$SUDO_USER"-"$Label" 2>/dev/null
chown "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label" 2>/dev/null
mkdir /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null
chown "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null
chmod 700 /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null
if [ -e /media/"$Label"/.Trash-"$SUDO_UID" ]; then
echo "-----------------------------------------------------------------"
echo "Script pour montage de partition de données terminé avec succès !"
echo ""
echo "Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/$Label/$SUDO_USER-$Label »."
else
echo "erreur inconnue !"
exit 10
fi
unset Rep2
break
;;
*)
unset Rep2
;;
esac
done
quelques tests rapides donnent :
Voulez-vous procéder au montage maintenant pour la partition « /dev/nvme0n1p12 » en y mettant pour étiquette « rety » ? [O/n]
L’UUID de la partition est déjà présent dans le fstab !
Voulez-vous démonter la partition « /dev/nvme0n1p12 » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « rety » ? [O/n]
umount: /media/opiu (/dev/nvme0n1p12) démonté
rmdir: suppression du répertoire, '/media/opiu'
umount: /mnt démonté
/mnt n’a pas été supprimé.
-----------------------------------------------------------------
Script pour montage de partition de données terminé avec succès !
Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/rety/iznobe-rety ».
iznobe@iznobe-pc:~/Scripts$
Voulez-vous démonter la partition « /dev/nvme0n1p12 » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « yhft » ? [O/n]
umount: /media/rety (/dev/nvme0n1p12) démonté
rmdir: suppression du répertoire, '/media/rety'
umount: /mnt: la cible est active.
/mnt n’a pas été supprimé.
umount: /mnt/test démonté
rmdir: suppression du répertoire, '/mnt/test'
-----------------------------------------------------------------
Script pour montage de partition de données terminé avec succès !
Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/yhft/iznobe-yhft ».
iznobe@iznobe-pc:~/Scripts$
Voulez-vous démonter la partition « /dev/nvme0n1p12 » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « tretr » ? [O/n]
umount: /mnt démonté
/mnt n’a pas été supprimé.
umount: /media/yhft (/dev/nvme0n1p12) démonté
rmdir: suppression du répertoire, '/media/yhft'
umount: /media/test démonté
rmdir: suppression du répertoire, '/media/test'
umount: /datas/test démonté
/datas/test n’a pas été supprimé.
-----------------------------------------------------------------
Script pour montage de partition de données terminé avec succès !
Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/tretr/iznobe-tretr ».
iznobe@iznobe-pc:~/Scripts$
PS : un ptit truc me chiffonne , avant , dans le " AWK " , avec le champ " label " qui pouvait être vide , on ajoutait une " case " vide au tableau pour pouvoir diviser par le nombre de " case " de chaque ligne ( 3 ) .
Là , tu as ajouté un champ : " mountpoint " , qui lui aussi peut etre vide . par contre , tu ne gères plus de la même manière pas ? les champs vides .
Quelle est la subtilité ? car on peut avoir soit 2 soit 3 soit 4 champs par partition ... et lors de la division du coup
En tout cas , je trouve le AWK de maintenant bien plus simple à comprendre .
Desolé , pour la variable "rgx_no_list" qui ne sert plus et le temps que tu as passé dessus
Dernière modification par iznobe (Le 19/04/2025, à 07:43)
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#250 Le 19/04/2025, à 07:30
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
je me dis que c' est mieux de " rmdir " uniquement si on est dans "/media/" ou dans " /mnt " en fait non ?
Du coup, la variable rgx_no_list perd de son intérêt puisqu’elle n’est appelée qu’une seule fois.
si je ne me suis pas trompé dans la regex
Je verrais plutôt :
local rgx="^(/mnt/|/media/).+$"
Pour être sûr d’avoir affaire à un sous-répertoire.
En ligne