#301 Le 24/04/2025, à 19:46
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
Bon , j ' ai modifié les 2 elifs ( ligne 58 ) à la suite ( soit je n' ai pas compris l ' intérêt , soit y avait un truc bizzare ) :
j ' ai modifié pour :
elif [[ -d $mp && $mp =~ $rgx ]]; then
rmdir -v "$mp"
else
echo "$mp n’a pas été supprimé."
fi
bref , là ca fait ce que ca dit , et ca dit ce que ca fait :
Voulez-vous démonter la partition « /dev/nvme0n1p12 » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « toi » ? [O/n]
umount: /media/moi (/dev/nvme0n1p12) démonté
rmdir: suppression du répertoire, '/media/moi'
mkdir: création du répertoire '/media/toi'
mkdir: création du répertoire '/media/toi/iznobe-toi'
appartenance de '/media/toi/iznobe-toi' modifiée de root:root en iznobe:iznobe
-----------------------------------------------------------------
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/toi/iznobe-toi ».
iznobe@iznobe-PC:~/Scripts$
et 2 autres bricoles :
#!/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.
# ----------------------------------------------------------------------------
LC_ALL=C
label() {
local rgx="[^[:alnum:]_-]"
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
if lsblk -no label | grep -q "$Label"; then
echo "Erreur, votre étiquette « $Label » est déjà attribuée ! Choisissez en une autre."
unset Label
fi
done
}
unmount() {
local rgx="^(/mnt/|/media/).+$"
local mp
mp="$(grep "$Label" /etc/fstab | cut -d ' ' -f 2)"
while true; 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] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
if [ -n "${PartMountPoints[0]}" ]; then
for pmp in "${PartMountPoints[@]}"; do
umount -v "$pmp"
if [[ -d $pmp && $pmp =~ $rgx ]]; then
rmdir -v "$pmp"
else
echo "$pmp n’a pas été supprimé."
fi
mapfile -t 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
elif [[ -d $mp && $mp =~ $rgx ]]; then
rmdir -v "$mp"
else
echo "$mp n’a pas été supprimé."
fi
sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
sed -i "/$Label/d" /etc/fstab
sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
break
;;
*)
;;
esac
done
}
if ((UID)); then
echo "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo »)"
exit 1
fi
declare -A ListPart
declare -A Rgx=( [fstype]="^(ext[2-4]|ntfs)" [mountP]="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$" )
i=-1
while read -ra lsblkDT; do #path fstype mountpoint label
if [[ ${lsblkDT[1]} =~ ${Rgx[fstype]} ]]; then
if [[ ${lsblkDT[2]} =~ ${Rgx[mountP]} ]]; then
continue
else
((++i))
ListPart[$i,0]="${lsblkDT[0]}"
ListPart[$i,1]="${lsblkDT[1]}"
if [[ ${lsblkDT[2]} =~ ^/ ]]; then
ListPart[$i,2]="${lsblkDT[2]}"
ListPart[$i,3]="${lsblkDT[3]}"
else
ListPart[$i,2]=""
ListPart[$i,3]="${lsblkDT[2]}"
fi
fi
fi
done < <(lsblk -no path,fstype,mountpoint,label)
if (( ${#ListPart[@]} == 0 )); then
echo "Il n’y a pas de partition susceptible d’être montée."
exit 2
fi
nbDev=$(("${#ListPart[@]}"/4))
echo
echo " n° ⇒ path label fstype mountpoint"
echo "-----------------------------------------------------------------"
for (( n=0; n<nbDev; n++ )); do
if ((n+1 < 10)); then
echo " $((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
else
echo " $((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
fi
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 true; do
read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] "
case "$REPLY" in
N|n)
Label="$PartLabel"
break
;;
Y|y|O|o|"")
label
break
;;
*)
;;
esac
done
fi
while true; do
read -rp "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $Label » ? [O/n] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
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
if ! [ -d /media/"$Label" ]; then
mkdir -v /media/"$Label"
fi
systemctl daemon-reload
if ! mount -a
then
exit 4
fi
if ! [ -d /media/"$Label"/"$SUDO_USER"-"$Label" ]; then
mkdir -v /media/"$Label"/"$SUDO_USER"-"$Label"
fi
chown -c "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label"
if ! [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]; then
mkdir -v /media/"$Label"/.Trash-"$SUDO_UID"
fi
chown -c "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID"
chmod -c 700 /media/"$Label"/.Trash-"$SUDO_UID"
if [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]; then
echo
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 5
fi
break
;;
*)
;;
esac
done
Dernière modification par iznobe (Le 24/04/2025, à 20:16)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#302 Le 24/04/2025, à 20:05
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
on peut mettre un " elif " sans d' abord avoir un " if " ???
ligne 56 a 59 .
Non, c’est une mauvaise indentation qui t’a induit en erreur.
Hors mis les " < < " , qu' est ce que cella fait en français ?
< <(command) : Cette syntaxe utilise la substitution de processus pour rediriger la sortie de command vers l'entrée standard de la boucle while. Cela signifie que la sortie de command est traitée ligne par ligne par la boucle.
un test au pif :
umount: /media/iznobe/test (/dev/nvme0n1p12) démonté
/media/iznobe/test n’a pas été supprimé.
mkdir: création du répertoire '/media/moi'
mkdir: création du répertoire '/media/moi/iznobe-moi'
appartenance de '/media/moi/iznobe-moi' modifiée de root:root en iznobe:iznobe-----------------------------------------------------------------
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/moi/iznobe-moi ».
iznobe@iznobe-PC:~/Scripts$c' est voulu ?
Hors ligne
#303 Le 24/04/2025, à 20:14
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
En fait c' est du au second elif , mal indenté , je l' ai supprimé pour le modifier en " else " a la place .
voir les dernier modifs / script de mon dernier message .
Ça a l' air d' aller comme ça .
Dernière modification par iznobe (Le 24/04/2025, à 20:24)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#304 Le 24/04/2025, à 20:17
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
( soit je n' ai pas compris l ' intérêt , soit y avait un truc bizzare )
Je pense plutôt à un truc bizarre.
et 2 autres bricoles
Peux-tu préciser ?
Et, si j’ai bien compris, la version à 80 colonnes ne te sied pas. Dommage.
Hors ligne
#305 Le 24/04/2025, à 20:23
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
et 2 autres bricoles
nany a écrit :Peux-tu préciser ?
l ' une est l' affichage des partitions , pour etre " raccord " avec le echo final et une vue plus aérée .
l' autre c' est la fonction label , je me suis dis que plutot que d ' arreter le script , il etait preferable de demander à l' utilisateur d ' entrer un autre label :
label() {
local rgx="[^[:alnum:]_-]"
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
elif lsblk -no label | grep -q "$Label"; then
echo "Erreur, votre étiquette « $Label » est déjà attribuée ! Choisissez en une autre."
unset Label
fi
done
}
rien de folichon . j ' espere juste ne pas avoir fait de bourde
Mais je suis pas certain du truc , car cette partie me parait pas claire :
Y|y|O|o|"")
mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
if [ -n "${PartMountPoints[0]}" ]; then
for pmp in "${PartMountPoints[@]}"; do
umount -v "$pmp"
if [[ -d $pmp && $pmp =~ $rgx ]]; then
rmdir -v "$pmp"
else
echo "$pmp n’a pas été supprimé."
fi
mapfile -t 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
elif [[ -d $mp && $mp =~ $rgx ]]; then
rmdir -v "$mp"
else
echo "$mp n’a pas été supprimé."
fi
je verrais ca plutot sans elif non ?
Y|y|O|o|"")
mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
if [ -n "${PartMountPoints[0]}" ]; then
...
traitement
...
if [[ -d $mp && $mp =~ $rgx ]]; then
rmdir -v "$mp"
else
echo "$mp n’a pas été supprimé."
fi
Dernière modification par iznobe (Le 24/04/2025, à 21:49)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#306 Le 25/04/2025, à 12:00
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
Bonjour,
iznobe a écrit :un test au pif :
umount: /media/iznobe/test (/dev/nvme0n1p12) démonté
/media/iznobe/test n’a pas été supprimé.
mkdir: création du répertoire '/media/moi'
mkdir: création du répertoire '/media/moi/iznobe-moi'
appartenance de '/media/moi/iznobe-moi' modifiée de root:root en iznobe:iznobe-----------------------------------------------------------------
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/moi/iznobe-moi ».
iznobe@iznobe-PC:~/Scripts$c' est voulu ?
iznobe a écrit :( soit je n' ai pas compris l ' intérêt , soit y avait un truc bizzare )
Je pense plutôt à un truc bizarre.
J’ai trouvé la « bizarrerie ».
C’est parce que tu avais testé avec une partition montée automatiquement (dans /media/$USER/<label>) et, lors du démontage, le point de montage est supprimé automatiquement.
L’erreur vient du fait qu’on teste à la fois la présence ou non du répertoire et s’il est dans /media/ ou /mnt/. Il faut en fait séparer les deux tests en imbriquant le second dans le premier :
if [ -n "${PartMountPoints[0]}" ]; then
for pmp in "${PartMountPoints[@]}"; do
umount -v "$pmp"
if [ -d "$pmp" ]; then
if [[ $pmp =~ $rgx ]]; then
rmdir -v "$pmp"
else
echo "$pmp n’a pas été supprimé."
fi
fi
mapfile -t 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
elif [ -d "$mp" ]; then
if [[ $mp =~ $rgx ]]; then
rmdir -v "$mp"
else
echo "$mp n’a pas été supprimé."
fi
fi
Et on GARDE le elif.
l ' une est l' affichage des partitions , pour etre " raccord " avec le echo final et une vue plus aérée .
C’est purement cosmétique et la différence entre les deux echo ne saute pas tout de suite aux yeux (je ne peux pas tester le résultat car j’ai moins de dix partitions).
Petite question : que se passe-t-il si on a cent partitions ou plus ?
l' autre c' est la fonction label , je me suis dis que plutot que d ' arreter le script , il etait preferable de demander à l' utilisateur d ' entrer un autre label
Je ferais les tests en même temps plutôt que séparément. Donc, là aussi, un elif.
Voici donc ce que ça donnerait :
#!/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.
# ----------------------------------------------------------------------------
LC_ALL=C
label() {
local rgx="[^[:alnum:]_-]"
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
elif lsblk -no label | grep -q "$Label"; then
echo "Erreur, votre étiquette « $Label » est déjà attribuée ! Choisissez-en une autre."
unset Label
fi
done
}
unmount() {
local rgx="^(/mnt/|/media/).+$"
local mp
mp="$(grep "$Label" /etc/fstab | cut -d ' ' -f 2)"
while true; 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] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
if [ -n "${PartMountPoints[0]}" ]; then
for pmp in "${PartMountPoints[@]}"; do
umount -v "$pmp"
if [ -d "$pmp" ]; then
if [[ $pmp =~ $rgx ]]; then
rmdir -v "$pmp"
else
echo "$pmp n’a pas été supprimé."
fi
fi
mapfile -t 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
elif [ -d "$mp" ]; then
if [[ $mp =~ $rgx ]]; then
rmdir -v "$mp"
else
echo "$mp n’a pas été supprimé."
fi
fi
sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
sed -i "/$Label/d" /etc/fstab
sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
break
;;
*)
;;
esac
done
}
if ((UID)); then
echo "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo »)."
exit 1
fi
declare -A ListPart
declare -A Rgx=( [fstype]="^(ext[2-4]|ntfs)" [mountP]="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$" )
i=-1
while read -ra lsblkDT; do #path fstype mountpoint label
if [[ ${lsblkDT[1]} =~ ${Rgx[fstype]} ]]; then
if [[ ${lsblkDT[2]} =~ ${Rgx[mountP]} ]]; then
continue
else
((++i))
ListPart[$i,0]="${lsblkDT[0]}"
ListPart[$i,1]="${lsblkDT[1]}"
if [[ ${lsblkDT[2]} =~ ^/ ]]; then
ListPart[$i,2]="${lsblkDT[2]}"
ListPart[$i,3]="${lsblkDT[3]}"
else
ListPart[$i,2]=""
ListPart[$i,3]="${lsblkDT[2]}"
fi
fi
fi
done < <(lsblk -no path,fstype,mountpoint,label)
if ((${#ListPart[@]} == 0)); then
echo "Il n’y a pas de partition susceptible d’être montée."
exit 2
fi
nbDev=$(("${#ListPart[@]}"/4))
echo
echo " n° ⇒ path label fstype mountpoint"
echo "--------------------------------------------"
for (( n=0; n<nbDev; n++ )); do
if ((n+1 < 10)); then
echo " $((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
else
echo " $((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
fi
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 true; do
read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] "
case "$REPLY" in
N|n)
Label="$PartLabel"
break
;;
Y|y|O|o|"")
label
break
;;
*)
;;
esac
done
fi
while true; do
read -rp "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $Label » ? [O/n] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
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
if ! [ -d /media/"$Label" ]; then
mkdir -v /media/"$Label"
fi
systemctl daemon-reload
if ! mount -a; then
exit 3
fi
if ! [ -d /media/"$Label"/"$SUDO_USER"-"$Label" ]; then
mkdir -v /media/"$Label"/"$SUDO_USER"-"$Label"
fi
chown -c "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label"
if ! [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]; then
mkdir -v /media/"$Label"/.Trash-"$SUDO_UID"
fi
chown -c "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID"
chmod -c 700 /media/"$Label"/.Trash-"$SUDO_UID"
if [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]; then
echo
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 4
fi
break
;;
*)
;;
esac
done
Et, comme je trouve cette version un peu « brouillon » et que je préfère la version à 80 colonnes, j’insiste lourdement :
#!/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. iznobe
# ----------------------------------------------------------------------------
LC_ALL=C
label() {
local rgx="[^[:alnum:]_-]"
while [ -z "$Label" ]
do
echo -n "Choisissez l’étiquette (LABEL) de votre partition de données, "
echo -n "elle doit être UNIQUE et ne pas contenir d’espace, d’accent, "
echo -n "de caractères spéciaux et au maximum 16 caractères : "
read -r Label
if [[ $Label =~ $rgx || ${#Label} -gt 16 ]]
then
echo -n "Le nom de votre étiquette comporte une espace, un accent ou un "
echo "caractère spécial ou plus de 16 caractères !"
unset Label
elif lsblk -no label | grep -q "$Label"
then
echo -n "Erreur, votre étiquette « $Label » est déjà attribuée ! "
echo "Choisissez-en une autre."
fi
done
}
unmount() {
local rgx="^(/mnt/|/media/).+$"
local mp
mp=$(grep "$Label" /etc/fstab | cut -d ' ' -f 2)
while true
do
echo -n "Voulez-vous démonter la partition « $Part » de son emplacement "
echo -n "actuel et procéder aux changements pour la monter avec "
echo -n "l'étiquette « $Label » ? [O/n] "
read -r
case $REPLY in
N|n)
echo "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
if [ -n "${PartMountPoints[0]}" ]
then
for pmp in "${PartMountPoints[@]}"
do
umount -v "$pmp"
if [ -d "$pmp" ]
then
if [[ $pmp =~ $rgx ]]
then
rmdir -v "$pmp"
else
echo "$pmp n’a pas été supprimé."
fi
fi
mapfile -t 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
elif [ -d "$mp" ]
then
if [[ $mp =~ $rgx ]]
then
rmdir -v "$mp"
else
echo "$mp n’a pas été supprimé."
fi
fi
sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
sed -i "/$Label/d" /etc/fstab
# Prise en compte du montage par le dash,
# sans délai, parfois la partition ne s’affiche pas.
sleep 1
break
;;
*)
;;
esac
done
}
if ((UID))
then
echo -n "Vous devez être super utilisateur pour lancer ce script "
echo "(essayez avec « sudo »)."
exit 1
fi
declare -A ListPart
declare -A Rgx=(
[fstype]='^(ext[2-4]|ntfs)'
[mountP]='^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$'
)
i=-1
while read -ra lsblkDT #path fstype mountpoint label
do
if [[ ${lsblkDT[1]} =~ ${Rgx[fstype]} ]]
then
if [[ ${lsblkDT[2]} =~ ${Rgx[mountP]} ]]
then
continue
else
((++i))
ListPart[$i,0]="${lsblkDT[0]}"
ListPart[$i,1]="${lsblkDT[1]}"
if [[ ${lsblkDT[2]} =~ ^/ ]]
then
ListPart[$i,2]="${lsblkDT[2]}"
ListPart[$i,3]="${lsblkDT[3]}"
else
ListPart[$i,2]=""
ListPart[$i,3]="${lsblkDT[2]}"
fi
fi
fi
done < <(lsblk -no path,fstype,mountpoint,label)
if ((${#ListPart[@]} == 0))
then
echo "Il n’y a pas de partition susceptible d’être montée."
exit 2
fi
nbDev=$(("${#ListPart[@]}"/4))
echo
echo "n° ⇒ path label fstype mountpoint"
echo "----------------------------------------"
for (( n=0; n<nbDev; n++ ))
do
if ((n+1 < 10)); then
echo -n " $((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]}"
echo " ${ListPart[$n,1]} ${ListPart[$n,2]}"
else
echo -n " $((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]}"
echo " ${ListPart[$n,1]} ${ListPart[$n,2]}"
fi
done
echo
while [ -z "$PartNum" ]
do
echo -n "Choisissez le numéro correspondant "
echo -n "à votre future partition de données : "
read -r 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 true
do
echo -n "Voulez-vous changer l’étiquette "
echo -n "de la partition « $Part » ? [O/n] "
read -r
case $REPLY in
N|n)
Label="$PartLabel"
break
;;
Y|y|O|o|"")
label
break
;;
*)
;;
esac
done
fi
while true
do
echo -n "Voulez-vous procéder au montage maintenant pour la partition "
echo -n "« $Part » en y mettant pour étiquette « $Label » ? [O/n] "
read -r
case $REPLY in
N|n)
echo "Annulation par l’utilisateur !"
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 -n "LABEL=$Label /media/$Label $PartFstype "
echo "defaults,nofail,x-systemd.device-timeout=1"
} >> /etc/fstab
elif [ "$PartFstype" == "ntfs" ]
then
ntfslabel "$Part" "$Label"
{
echo -n "LABEL=$Label /media/$Label ntfs3 defaults,"
echo -n "nofail,x-systemd.device-timeout=1,x-gvfs-show,"
echo "nohidden,uid=$SUDO_UID,gid=$SUDO_GID"
} >> /etc/fstab
fi
if ! [ -d /media/"$Label" ]
then
mkdir -v /media/"$Label"
fi
systemctl daemon-reload
if ! mount -a
then
exit 3
fi
if ! [ -d /media/"$Label"/"$SUDO_USER"-"$Label" ]
then
mkdir -v /media/"$Label"/"$SUDO_USER"-"$Label"
fi
chown -c "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label"
if ! [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]
then
mkdir -v /media/"$Label"/.Trash-"$SUDO_UID"
fi
chown -c "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID"
chmod -c 700 /media/"$Label"/.Trash-"$SUDO_UID"
if [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]
then
echo
echo "-----------------------------------------------------------------"
echo "Script pour montage de partition de données terminé avec succès !"
echo
echo -n "Vous pouvez maintenant accéder à votre partition en parcourant"
echo " le dossier suivant : « /media/$Label/$SUDO_USER-$Label »."
else
echo "Erreur inconnue !"
exit 4
fi
break
;;
*)
;;
esac
done
Hors ligne
#307 Le 25/04/2025, à 14:26
- lynn
Re : [ SCRIPT ] pour montage automatique partitions internes
J’ai trouvé la « bizarrerie ».
C’est parce que tu avais testé avec une partition montée automatiquement (dans /media/$USER/<label>) et, lors du démontage, le point de montage est supprimé automatiquement.
Il n'est pas conseillé de monter quoi que ce soit dans /media, ça peut devenir source de problème. Mieux vaut utiliser un autre répertoire quitte à en créer un et même, pourquoi pas, à la racine du disque dur.
Certains utiliseront /mnt, d'autres diront que c'est fait pour du montage temporaire, peut importe mais en tout cas ce n'est pas /media qu'il faut utiliser pour un montage personnel et encore moins quand on vise à renseigner ce montage dans fstab ou via un service systemd.
Après, chacun fait ce qu'il veut... c'est bien l'avantage du libre !
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#308 Le 25/04/2025, à 18:44
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
Il n'est pas conseillé de monter quoi que ce soit dans /media, ça peut devenir source de problème.
Salut , a bon ?
sur le forum , au contraire il est souvent conseillé d ' utiliser ce repertoire , du coup , as tu des exemples de " problemes " ?
j' étais par contre au courant de l' " exclusivité " du répertoire /media/$USER , ça oui .
J’ai trouvé la « bizarrerie ».
C’est parce que tu avais testé avec une partition montée automatiquement (dans /media/$USER/<label>) et, lors du démontage, le point de montage est supprimé automatiquement.
L’erreur vient du fait qu’on teste à la fois la présence ou non du répertoire et s’il est dans /media/ ou /mnt/. Il faut en fait séparer les deux tests en imbriquant le second dans le premier :
oui exact .
cela dit pour le "elif " , je parlais de celui-ci à la base ( depuis 3 messages ) :
unmount() {
local rgx="^(/mnt/|/media/).+$"
local mp
mp="$(grep "$Label" /etc/fstab | cut -d ' ' -f 2)"while true; 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] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
if [ -n "${PartMountPoints[0]}" ]; then
for pmp in "${PartMountPoints[@]}"; do
umount -v "$pmp"
if [[ -d $pmp && $pmp =~ $rgx ]]; then
rmdir -v "$pmp"
else
echo "$pmp n’a pas été supprimé."
fi
mapfile -t 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
elif [[ -d $mp && $mp =~ $rgx ]]; then
rmdir -v "$mp"
elif [ -n "$mp" ]; then
echo "$mp n’a pas été supprimé."
fi
sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
sed -i "/$Label/d" /etc/fstab
sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
break
;;
*)
;;
esac
done
}
que tu n' as pas remis dans ta dernière portion de code .
Petite question : que se passe-t-il si on a cent partitions ou plus ?
un décalage visuel , pas très zoli , Mais je doute fort que le gars qui a 100 partitions ou plus utilise ce script pour monter l' une d' entre elles
iznobe a écrit :
l' autre c' est la fonction label , je me suis dis que plutot que d ' arreter le script , il etait preferable de demander à l' utilisateur d ' entrer un autre label
Je ferais les tests en même temps plutôt que séparément. Donc, là aussi, un elif.
oui j' avais edité entre temps pour faire le test avec un elif car ça merdoyait un peu , et faisait double affichage ...
Pour la fonction unmount :
unmount() {
local rgx="^(/mnt/|/media/).+$"
local mp
mp="$(grep "$Label" /etc/fstab | cut -d ' ' -f 2)"
while true; 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] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
if [ -n "${PartMountPoints[0]}" ]; then
for pmp in "${PartMountPoints[@]}"; do
umount -v "$pmp"
if [[ -d $pmp && $pmp =~ $rgx ]]; then
rmdir -v "$pmp"
else
echo "$pmp n’a pas été supprimé."
fi
mapfile -t 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
elif [[ -d $mp && $mp =~ $rgx ]]; then
rmdir -v "$mp"
else
echo "$mp n’a pas été supprimé."
fi
sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
sed -i "/$Label/d" /etc/fstab
sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
break
;;
*)
;;
esac
done
}
quel est l' intérêt de vérifier tout ça :
local mp
mp="$(grep "$Label" /etc/fstab | cut -d ' ' -f 2)"
...
elif [[ -d $mp && $mp =~ $rgx ]]; then
rmdir -v "$mp"
else
echo "$mp n’a pas été supprimé."
fi
sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
sed -i "/$Label/d" /etc/fstab
Cela me semble inutile et en double , vu que cette partie de code aura deja fait le boulot non :
if [ -n "${PartMountPoints[0]}" ]; then
for pmp in "${PartMountPoints[@]}"; do
umount -v "$pmp"
if [[ -d $pmp && $pmp =~ $rgx ]]; then
rmdir -v "$pmp"
else
echo "$pmp n’a pas été supprimé."
fi
mapfile -t 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
et comme j' avais deja dit avant , cette ligne recupere plus ou moins n ' importe quoi :
iznobe@iznobe-PC:~$ Label=to
iznobe@iznobe-PC:~$ mp="$(grep "$Label" /etc/fstab | cut -d ' ' -f 2)"
iznobe@iznobe-PC:~$ echo "$mp"
Use
device;
montage
https://github.com/trapexit/mergerfs https://zackreed.me/mergerfs-another-good-option-to-pool-your-snapraid-disks/
#evisk/by-label/Sauvegardes /media/Sauvegardes ext4 defaults,noauto 0 2
/media/toi
iznobe@iznobe-PC:~$
Certes on teste que le contenu recuperé est un repertoire , mais un jour ou l' autre avec un peu de malchance , on tombera bien sur quelquechose qu ' il ne faut pas ...
puis je ne vois pas à quoi cela sert ...
Ha , c' est peut être pour supprimer les lignes du fstab d' une partition non montée ?
Dans ce cas, il faut peut etre mieux " circonscrire " , j' avais fait un bout de code dans la discussion pour justement traiter " Label " dans le fstab .
je vais retrouver ça
le voici :
if grep -Eq "(LABEL=|by-label/)$Label" /etc/fstab; then
du coup , je remplacerai :
mp="$(grep "$Label" /etc/fstab | cut -d ' ' -f 2)"
par :
mp="$(grep -E "(LABEL=|by-label/)$Label" /etc/fstab | cut -d ' ' -f 2)"
ca parait plus propre , vu le retour de cette dernière :
iznobe@iznobe-PC:~$ echo "$mp"
/media/toi
iznobe@iznobe-PC:~$
il me semble qu ' il n' y a que 2 façons de monter des partitions via leurs " labels " non ???
Et sinon , pour finir , c' est quoi cette histoire de 80 colonnes ??
Dernière modification par iznobe (Le 25/04/2025, à 19:19)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#309 Le 25/04/2025, à 19:37
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
bon ca ne va pas non plus pour la ligne suivante ( toujours dans le fonction unmount ) :
sed -i "/$Label/d" /etc/fstab
ni pour celle-ci :
elif lsblk -no label | grep -q "$Label"; then
Perso , je verrai unmount plutôt comme ça :
unmount() {
local rgx="^(/mnt/|/media/).+$"
local regLab="^(LABEL=|/dev/disk/by-label/)+$Label.+$"
local mp="$(grep -E "$regLab" /etc/fstab | cut -d ' ' -f 2)"
while true; 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] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
# traitement des partitions montées :
mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
if [ -n "${PartMountPoints[0]}" ]; then
for pmp in "${PartMountPoints[@]}"; do
umount -v "$pmp"
if [ -d "$pmp" ]; then
if [[ $pmp =~ $rgx ]]; then
rmdir -v "$pmp"
else
echo "$pmp n’a pas été supprimé."
fi
fi
mapfile -t 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
# traitement des partitions NON montées :
elif [ -d "$mp" ]; then
if [[ $mp =~ $rgx ]]; then
rmdir -v "$mp"
else
echo "$mp n’a pas été supprimé."
fi
sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
sed -i "/$regLab/d" /etc/fstab
fi
sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
break
;;
*)
;;
esac
done
}
Pas testé , mais quasi sûr que ça ne fonctionne pas
Dernière modification par iznobe (Le 25/04/2025, à 20:51)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#310 Le 25/04/2025, à 20:34
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
echo "$pmp n’a pas été supprimé." on dirait l'énoncé d'un problème ou d'une erreur, alors que c'est une simple information : echo "$pmp a été conservé."
non ?
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#311 Le 25/04/2025, à 20:49
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
Modifications des lignes qui " ne vont pas " :
#!/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.
# ----------------------------------------------------------------------------
LC_ALL=C
label() {
local rgx="[^[:alnum:]_-]"
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
elif [[ lsblk -no label =~ $regLab ]]; then
echo "Erreur, votre étiquette « $Label » est déjà attribuée ! Choisissez-en une autre."
unset Label
fi
done
}
unmount() {
local rgx="^(/mnt/|/media/).+$"
local mp
mp="$(grep -E "$regFstabLab" /etc/fstab | cut -d ' ' -f 2)"
while true; 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] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
# traitement des partitions montées :
mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
if [ -n "${PartMountPoints[0]}" ]; then
for pmp in "${PartMountPoints[@]}"; do
umount -v "$pmp"
if [ -d "$pmp" ]; then
if [[ $pmp =~ $rgx ]]; then
rmdir -v "$pmp"
else
echo "$pmp n’a pas été supprimé."
fi
fi
mapfile -t 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
# traitement des partitions NON montées :
elif [ -d "$mp" ]; then
echo "$mp"
if [[ $mp =~ $rgx ]]; then
rmdir -v "$mp"
else
echo "$mp n’a pas été supprimé."
fi
sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
sed -i "/$regFstabLab/d" /etc/fstab
fi
sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
break
;;
*)
;;
esac
done
}
if ((UID)); then
echo "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo »)."
exit 1
fi
declare -A ListPart
declare -A Rgx=( [fstype]="^(ext[2-4]|ntfs)" [mountP]="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$" )
regFstabLab="^(LABEL=|/dev/disk/by-label/)$Label$"
regLab="^($Label)$"
i=-1
while read -ra lsblkDT; do #path fstype mountpoint label
if [[ ${lsblkDT[1]} =~ ${Rgx[fstype]} ]]; then
if [[ ${lsblkDT[2]} =~ ${Rgx[mountP]} ]]; then
continue
else
((++i))
ListPart[$i,0]="${lsblkDT[0]}"
ListPart[$i,1]="${lsblkDT[1]}"
if [[ ${lsblkDT[2]} =~ ^/ ]]; then
ListPart[$i,2]="${lsblkDT[2]}"
ListPart[$i,3]="${lsblkDT[3]}"
else
ListPart[$i,2]=""
ListPart[$i,3]="${lsblkDT[2]}"
fi
fi
fi
done < <(lsblk -no path,fstype,mountpoint,label)
if ((${#ListPart[@]} == 0)); then
echo "Il n’y a pas de partition susceptible d’être montée."
exit 2
fi
nbDev=$(("${#ListPart[@]}"/4))
echo
echo " n° ⇒ path label fstype mountpoint"
echo "--------------------------------------------"
for (( n=0; n<nbDev; n++ )); do
if ((n+1 < 10)); then
echo " $((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
else
echo " $((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
fi
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 true; do
read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] "
case "$REPLY" in
N|n)
Label="$PartLabel"
break
;;
Y|y|O|o|"")
label
break
;;
*)
;;
esac
done
fi
while true; do
read -rp "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $Label » ? [O/n] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
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 "$regFstabLab" /etc/fstab; then # 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
if ! [ -d /media/"$Label" ]; then
mkdir -v /media/"$Label"
fi
systemctl daemon-reload
if ! mount -a; then
exit 3
fi
if ! [ -d /media/"$Label"/"$SUDO_USER"-"$Label" ]; then
mkdir -v /media/"$Label"/"$SUDO_USER"-"$Label"
fi
chown -c "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label"
if ! [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]; then
mkdir -v /media/"$Label"/.Trash-"$SUDO_UID"
fi
chown -c "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID"
chmod -c 700 /media/"$Label"/.Trash-"$SUDO_UID"
if [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]; then
echo
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 4
fi
break
;;
*)
;;
esac
done
Dernière modification par iznobe (Le 25/04/2025, à 20:50)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#312 Le 25/04/2025, à 21:29
- lynn
Re : [ SCRIPT ] pour montage automatique partitions internes
Salut , a bon ?
sur le forum , au contraire il est souvent conseillé d ' utiliser ce repertoire , du coup , as tu des exemples de " problemes " ?
j' étais par contre au courant de l' " exclusivité " du répertoire /media/$USER , ça oui .
J'ai toujours entendu dire que le système utilisait /media pour créer ses points de montages pour les disques amovibles, cd, usb etc. Maintenant c'est dans /media/$USER mais certains logiciels créent leurs répertoires à la racine de /media. Récemment, nomachine m'a créé un répertoire «nomachine» à la racine de /media...
C'est capillotracté mais que se passerait-il si un logiciel avait besoin de créer dans /media, un répertoire du même nom que l'un de tes points de montage manuel ?
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#313 Le 25/04/2025, à 21:33
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
/media This directory contains mount points for removable media such as CD and DVD disks or USB sticks. [...]
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#314 Le 25/04/2025, à 22:00
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
j ' ai mis " regLab "en variable " globale " pensant qu ' on en avait besoin ailleurs , mais à priori ce n' est pas le cas .
on peut donc la mettre en local à la fonction " label " je pense.
@watael et aux autres , Rien à dire sur les dernières modifications apportées ?
Pour la modification des points de montage à la racine , lors mes essais , je me rappelle que ce n' est pas forcément si évident que cela , j ' avais bien galeré sur un un point particulier , mais je ne sais plus trop si c' est pour les permissions ou si c' était du au fait que ça ne supporte pas les signes diacritiques ( si c' est ce dernier point , en tout cas , on ne devrait pas être embêté puisque il directement lié a " LABEL " et que c' est exclu pour celui-ci ) .
Dans " man hier " , il n' y a rien de prévu spécifiquement pour monter les partitions " en dur " , ou alors j' ai raté l' info ( apres comme le script peut aussi servir à monter des partitions externes ... )
Par contre , il ne date pas vraiment d' hier :
STANDARDS The Filesystem Hierarchy Standard (FHS), Version 3.0, published March 19, 2015
Sinon , lors de mes essais avec le script , je rencontre régulièrement des erreurs du même type :
mount: /media/po: /dev/nvme0n1p12 déjà monté ou point de montage actif.
dmesg(1) may have more information after failed mount system call.
iznobe@iznobe-PC:~/Scripts$
et du coup , il ne poursuit pas ... ( normal vu le " exit 3 " ) , mais bon , logiquement il devrait non ?
Alors voici , avec le répertoire " conservé " plutôt que non supprimé et la variable regLab en local a label :
#!/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.
# ----------------------------------------------------------------------------
LC_ALL=C
label() {
local rgx="[^[:alnum:]_-]"
local regLab="^($Label)$"
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
elif [[ $(lsblk -no label) =~ $regLab ]]; then
echo "Erreur, votre étiquette « $Label » est déjà attribuée ! Choisissez-en une autre."
unset Label
fi
done
}
unmount() {
local rgx="^(/mnt/|/media/).+$"
local mp
mp="$(grep -E "$regFstabLab" /etc/fstab | cut -d ' ' -f 2)"
while true; 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] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
# traitement des partitions montées :
mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
if [ -n "${PartMountPoints[0]}" ]; then
for pmp in "${PartMountPoints[@]}"; do
umount -v "$pmp"
if [ -d "$pmp" ]; then
if [[ $pmp =~ $rgx ]]; then
rmdir -v "$pmp"
else
echo "$pmp a été conservé."
fi
fi
mapfile -t 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
# traitement des partitions NON montées :
elif [ -d "$mp" ]; then
echo "$mp"
if [[ $mp =~ $rgx ]]; then
rmdir -v "$mp"
else
echo "$mp a été conservé."
fi
sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
sed -i "/$regFstabLab/d" /etc/fstab
fi
sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
break
;;
*)
;;
esac
done
}
if ((UID)); then
echo "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo »)."
exit 1
fi
declare -A ListPart
declare -A Rgx=( [fstype]="^(ext[2-4]|ntfs)" [mountP]="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$" )
regFstabLab="^(LABEL=|/dev/disk/by-label/)$Label$"
i=-1
while read -ra lsblkDT; do #path fstype mountpoint label
if [[ ${lsblkDT[1]} =~ ${Rgx[fstype]} ]]; then
if [[ ${lsblkDT[2]} =~ ${Rgx[mountP]} ]]; then
continue
else
((++i))
ListPart[$i,0]="${lsblkDT[0]}"
ListPart[$i,1]="${lsblkDT[1]}"
if [[ ${lsblkDT[2]} =~ ^/ ]]; then
ListPart[$i,2]="${lsblkDT[2]}"
ListPart[$i,3]="${lsblkDT[3]}"
else
ListPart[$i,2]=""
ListPart[$i,3]="${lsblkDT[2]}"
fi
fi
fi
done < <(lsblk -no path,fstype,mountpoint,label)
if ((${#ListPart[@]} == 0)); then
echo "Il n’y a pas de partition susceptible d’être montée."
exit 2
fi
nbDev=$(("${#ListPart[@]}"/4))
echo
echo " n° ⇒ path label fstype mountpoint"
echo "--------------------------------------------"
for (( n=0; n<nbDev; n++ )); do
if ((n+1 < 10)); then
echo " $((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
else
echo " $((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
fi
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]}"
#umount -v /media/"$PartLabel"
if [ -z "$PartLabel" ]; then
echo "La partition « $Part » n’a pas d’étiquette."
label
else
echo "La partition « $Part » a l’étiquette « $PartLabel »."
while true; do
read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] "
case "$REPLY" in
N|n)
Label="$PartLabel"
break
;;
Y|y|O|o|"")
label
break
;;
*)
;;
esac
done
fi
while true; do
read -rp "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $Label » ? [O/n] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
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 "$regFstabLab" /etc/fstab; then # 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
if ! [ -d /media/"$Label" ]; then
mkdir -v /media/"$Label"
fi
systemctl daemon-reload
if ! mount -a; then
exit 3
fi
if ! [ -d /media/"$Label"/"$SUDO_USER"-"$Label" ]; then
mkdir -v /media/"$Label"/"$SUDO_USER"-"$Label"
fi
chown -c "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label"
if ! [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]; then
mkdir -v /media/"$Label"/.Trash-"$SUDO_UID"
fi
chown -c "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID"
chmod -c 700 /media/"$Label"/.Trash-"$SUDO_UID"
if [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]; then
echo
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 4
fi
break
;;
*)
;;
esac
done
@nany , je suis toujours pas convaincu pour :
unmount() {
local rgx="^(/mnt/|/media/).+$"
local mp
mp="$(grep -E "$regFstabLab" /etc/fstab | cut -d ' ' -f 2)"while true; 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] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
# traitement des partitions montées :
mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
if [ -n "${PartMountPoints[0]}" ]; then
for pmp in "${PartMountPoints[@]}"; do
umount -v "$pmp"
if [ -d "$pmp" ]; then
if [[ $pmp =~ $rgx ]]; then
rmdir -v "$pmp"
else
echo "$pmp a été conservé."
fi
fi
mapfile -t 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
# traitement des partitions NON montées :
elif [ -d "$mp" ]; then
echo "$mp"
if [[ $mp =~ $rgx ]]; then
rmdir -v "$mp"
else
echo "$mp a été conservé."
fi
sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
sed -i "/$regFstabLab/d" /etc/fstab
fi
sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
break
;;
*)
;;
esac
done
}
Comme on peut avoir des partitions montées plusieurs fois , on peut tres bien avoir un utilisateur ( rencontrer des cas ) qui possedent plusieurs lignes dans le fstab et que pour l' une d' elles la partition ne soit pas montée ...
2 " if " me parait couvrir tous les cas , contrairement a un if elif .
Dernière modification par iznobe (Le 25/04/2025, à 22:57)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#315 Le 27/04/2025, à 12:26
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
Bonjour,
Je n’ai que peu de temps en ce moment donc réponse rapide.
Ha , c' est peut être pour supprimer les lignes du fstab d' une partition non montée ?
Et sinon , pour finir , c' est quoi cette histoire de 80 colonnes ??
C’est pour respecter l’antique contrainte des 80 colonnes des cartes perforées IBM.
Même si j’ai fait remarquer que Linus Torvalds trouve ça has been. Je ne suis pas entièrement d’accord avec lui. Je trouve que l’affichage en 80 colonnes plus agréable à lire même s’il n’est pas forcément plus lisible.
@watael et aux autres , Rien à dire sur les dernières modifications apportées ?
local regLab="^($Label)$"
Ça ne marche pas sans parenthèse ?
regFstabLab="^(LABEL=|/dev/disk/by-label/)$Label$"
Avec le dollar à la fin, cette expression régulière cherche les lignes qui ne contienne que LABEL=$Label ou /dev/disk/by-label/$Label dans fstab, ce qui ne devrait a priori jamais matcher.
Comme on peut avoir des partitions montées plusieurs fois , on peut tres bien avoir un utilisateur ( rencontrer des cas ) qui possedent plusieurs lignes dans le fstab et que pour l' une d' elles la partition ne soit pas montée ...
2 " if " me parait couvrir tous les cas , contrairement a un if elif .
Oui.
Hors ligne
#316 Le 27/04/2025, à 12:42
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
Bonjour,
iznobe a écrit :Et sinon , pour finir , c' est quoi cette histoire de 80 colonnes ??
C’est pour respecter l’antique contrainte des 80 colonnes des cartes perforées IBM.
Même si j’ai fait remarquer que Linus Torvalds trouve ça has been. Je ne suis pas entièrement d’accord avec lui. Je trouve que l’affichage en 80 colonnes plus agréable à lire même s’il n’est pas forcément plus lisible.
oui c' est vrai que ca se lis bien , mais ca implique des repetitions de commande , par exemple 3 echo au lieu d' un .
iznobe a écrit :@watael et aux autres , Rien à dire sur les dernières modifications apportées ?
iznobe a écrit :local regLab="^($Label)$"
Ça ne marche pas sans parenthèse ?
j ' ai meme pas pas essayé sans .
iznobe a écrit :regFstabLab="^(LABEL=|/dev/disk/by-label/)$Label$"
Avec le dollar à la fin, cette expression régulière cherche les lignes qui ne contienne que LABEL=$Label ou /dev/disk/by-label/$Label dans fstab, ce qui ne devrait a priori jamais matcher.
Ha , je vais tester plus précisément cela alors .
Dernière modification par iznobe (Le 27/04/2025, à 16:21)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#317 Le 27/04/2025, à 13:42
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
printf '%s ' \
"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 :"
et hop! une seule commande.
Dernière modification par Watael (Le 27/04/2025, à 13:42)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#318 Le 27/04/2025, à 18:54
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
bon , je ne sais pas si c' est à cause du bug , mais je ne suis pas arrivé a utilisé la regex regFstabLabel . je l' ai virée du coup ... Ca fonctionne sans .
Idem , la fonction choixlabel est dans les choux . pas compris pourquoi , mais ne fonctionne pas du coup .
le probleme avec l ' ancienne version ( grep ) c' est que si l' ancienne etiquette est par exemple " pol " et que l' on choisis pour la nouvelle " po " , alors forcément ca matche
on a fait un grosse bourde avec Label ...
Du coup modification de noms de fonction et de variables pour ne plus s' emmêler les pinceaux et quelques modifs du code .
cette ligne était à la fois pas assez précise et surtout elle n' utilisait pas la bonne variable :
elif lsblk -no label | grep -q "$Label"; then
on aurait du y mettre $PartLabel comme variable à la place de $Label .
nouveau script :
#!/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.
# ----------------------------------------------------------------------------
LC_ALL=C
choixlabel() {
local rgx="[^[:alnum:]_-]"
while [ -z "$newLabel" ]; 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 : " newLabel
if [[ $newLabel =~ $rgx || ${#newLabel} -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 newLabel
fi
mapfile -t labels < <(lsblk -no label)
if [ -n "${labels[0]}" ]; then
for lab in "${labels[@]}"; do
if [[ $lab =~ ^$newLabel$ ]]; then
echo "Erreur, votre étiquette « $newLabel » est déjà attribuée ! Choisissez-en une autre."
unset newLabel
fi
done
fi
done
}
unmount() {
local rgx="^(/mnt/|/media/).+$"
while true; 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 « $newLabel » ? [O/n] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
# traitement des partitions montées :
mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
if [ -n "${PartMountPoints[0]}" ]; then
for pmp in "${PartMountPoints[@]}"; do
umount -v "$pmp"
if [ -d "$pmp" ]; then
if [[ $pmp =~ $rgx ]]; then
rmdir -v "$pmp"
else
echo "$pmp a été conservé."
fi
fi
mapfile -t 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
fi
# traitement des partitions NON montées :
mapfile -t mountPoints < <(grep -E "^(LABEL=|/dev/disk/by-label/)$PartLabel" /etc/fstab | cut -d ' ' -f 2)
if [ -n "${mountPoints[0]}" ]; then
for mp in "${mountPoints[@]}"; do
if [ -d "$mp" ]; then
if [[ $mp =~ $rgx ]]; then
rmdir -v "$mp"
else
echo "$mp a été conservé."
fi
fi
mapfile -t numLines < <(grep -n "$mp" /etc/fstab | cut -d ":" -f 1 | sort -rn)
for n in "${numLines[@]}"; do
sed -i "${n}d" /etc/fstab
done
done
#sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
fi
sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
break
;;
*)
;;
esac
done
}
if ((UID)); then
echo "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo »)."
exit 1
fi
declare -A ListPart
declare -A Rgx=( [fstype]="^(ext[2-4]|ntfs)" [mountP]="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$" )
i=-1
while read -ra lsblkDT; do #path fstype mountpoint label
if [[ ${lsblkDT[1]} =~ ${Rgx[fstype]} ]]; then
if [[ ${lsblkDT[2]} =~ ${Rgx[mountP]} ]]; then
continue
else
((++i))
ListPart[$i,0]="${lsblkDT[0]}"
ListPart[$i,1]="${lsblkDT[1]}"
if [[ ${lsblkDT[2]} =~ ^/ ]]; then
ListPart[$i,2]="${lsblkDT[2]}"
ListPart[$i,3]="${lsblkDT[3]}"
else
ListPart[$i,2]=""
ListPart[$i,3]="${lsblkDT[2]}"
fi
fi
fi
done < <(lsblk -no path,fstype,mountpoint,label)
if ((${#ListPart[@]} == 0)); then
echo "Il n’y a pas de partition susceptible d’être montée."
exit 2
fi
nbDev=$(("${#ListPart[@]}"/4))
echo
echo " n° ⇒ path label fstype mountpoint"
echo "--------------------------------------------"
for (( n=0; n<nbDev; n++ )); do
if ((n+1 < 10)); then
echo " $((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
else
echo " $((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
fi
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]}"
#umount -v /media/"$PartLabel"
if [ -z "$PartLabel" ]; then
echo "La partition « $Part » n’a pas d’étiquette."
choixlabel
else
echo "La partition « $Part » a l’étiquette « $PartLabel »."
while true; do
read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] "
case "$REPLY" in
N|n)
newLabel="$PartLabel"
break
;;
Y|y|O|o|"")
choixlabel
break
;;
*)
;;
esac
done
fi
while true; do
read -rp "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $newLabel » ? [O/n] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
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 !"
elif grep -Eq "(LABEL=|/dev/disk/by-label/)$newLabel" /etc/fstab; then
echo "L’étiquette « $newLabel » est déjà utilisée dans le fstab !"
elif grep -q "^$Part" /etc/mtab; then
echo "La partition « $Part » est déjà montée !"
fi
unmount
# construction des éléments :
if [[ $PartFstype =~ ext[2-4] ]]; then
e2label "$Part" "$newLabel"
echo "LABEL=$newLabel /media/$newLabel $PartFstype defaults,nofail,x-systemd.device-timeout=1" >> /etc/fstab
elif [ "$PartFstype" == "ntfs" ]; then
ntfslabel "$Part" "$newLabel"
echo "LABEL=$newLabel /media/$newLabel ntfs3 defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
fi
if ! [ -d /media/"$newLabel" ]; then
mkdir -v /media/"$newLabel"
fi
systemctl daemon-reload
if ! mount -a; then
echo "erreur innatendue , annulation des modifications !"
rmdir -v /media/"$newLabel"
systemctl daemon-reload
exit 3
fi
if ! [ -d /media/"$newLabel"/"$SUDO_USER"-"$newLabel" ]; then
mkdir -v /media/"$newLabel"/"$SUDO_USER"-"$newLabel"
fi
chown -c "$SUDO_USER": /media/"$newLabel"/"$SUDO_USER"-"$newLabel"
if ! [ -d /media/"$newLabel"/.Trash-"$SUDO_UID" ]; then
mkdir -v /media/"$newLabel"/.Trash-"$SUDO_UID"
fi
chown -c "$SUDO_USER": /media/"$newLabel"/.Trash-"$SUDO_UID"
chmod -c 700 /media/"$newLabel"/.Trash-"$SUDO_UID"
if [ -d /media/"$newLabel"/.Trash-"$SUDO_UID" ]; then
echo
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/$newLabel/$SUDO_USER-$newLabel »."
xdg-open "/media/$newLabel/$SUDO_USER-$newLabel"
else
echo "Erreur inconnue !"
exit 4
fi
break
;;
*)
;;
esac
done
Dernière modification par iznobe (Le 27/04/2025, à 20:49)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#319 Le 27/04/2025, à 22:22
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
J’ai omis de répondre à ça :
Sinon , lors de mes essais avec le script , je rencontre régulièrement des erreurs du même type :
mount: /media/po: /dev/nvme0n1p12 déjà monté ou point de montage actif. dmesg(1) may have more information after failed mount system call. iznobe@iznobe-PC:~/Scripts$
et du coup , il ne poursuit pas ... ( normal vu le " exit 3 " ) , mais bon , logiquement il devrait non ?
L’exit est dû au problème que j’ai rencontré.
Pour ton cas, il faudrait voir pourquoi la partition est déjà montée.
Ça me semble être du cas par cas et difficilement scriptable, donc je pense que l’exit est préférable dans tous les cas.
oui c' est vrai que ca se lis bien , mais ca implique des repetitions de commande , par exemple 3 echo au lieu d' un .
Certes mais je préfère. Et, comme l’a fait remarquer Watael, il est possible d’utiliser printf pour n’avoir qu’une commande.
bon , je ne sais pas si c' est à cause du bug , mais je ne suis pas arrivé a utilisé la regex regFstabLabel . je l' ai virée du coup
Je m’y perds dans tous ces changements. Je regarderai quand j’aurai du temps et à tête reposée.
Hors ligne
#320 Le 28/04/2025, à 15:02
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
en fait , je n' ai pas changé grand chose .
le nom de la fonction pouvait porter a confusion , avant : label , apres choixlabel .
Dans cette fonction , on utilisait un " simple " grep $label , sauf que , si la nouvelle étiquette est contenue dans l ' ancienne , ca ne marche pas . exemple pier-paul et pier ou paul ...
j ' ai donc modifié le code pour passer par une regex avec debut et fin de mot , ce qui supprimera ce " phénomène " non desiré .
En suite , j ' ai changé le nom de la variable " label " , par newlabel " , ce qui je l' espère , nous evitera ultérieurement de nous emmêler les pinceaux ..
et le dernier changement , c' est pour le cas ou , la partition ne serait pas montée , mais que le fstab comporterait plusieurs lignes , peu de chances , mais avec les zigs ... vaut mieux prévoir . j ' ai don repris la façon de faire de watael ( je crois pour creer un tabbleau et boucler pour les rmdir et le fstab ) , puisque la ligne sed pour les UUID gere a elle seule toutes les entrées via UUID .
Voilà pour les explications .
le seul truc qui ne marche pas , c ' est cette partie de code :
mapfile labels < <(lsblk -no label)
if [ -n "${labels[0]}" ]; then
for lab in "${labels[@]}"; do
if [[ $lab =~ ^$newLabel$ ]]; then
echo "Erreur, votre étiquette « $newLabel » est déjà attribuée ! Choisissez-en une autre."
unset newLabel
fi
done
fi
done
j' ai aussi essayé avec :
mapfile labels < <(lsblk -no label)
if [ -n "${labels[0]}" ]; then
for lab in "${labels[@]}"; do
echo "$lab=$newLabel"
if [[ "$lab" == "$newLabel" ]]; then
echo "OK"
unset newLabel
break
fi
done
fi
OK ne s' affiche pas , alors qu ' évidemment , pour mon test j ' indique une étiquette deja utilisé .
voici ce que j' obtiens avec le code ci-dessus :
Choisissez le numéro correspondant à votre future partition de données : 16
La partition « /dev/nvme0n1p12 » a l’étiquette « SSD_BOOTEFI ».
Voulez-vous changer l’étiquette de la partition « /dev/nvme0n1p12 » ? [O/n]
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 : SSD_BOOTEFI
=SSD_BOOTEFI
WD8
=SSD_BOOTEFI
SAUV
=SSD_BOOTEFI
=SSD_BOOTEFI
Data
=SSD_BOOTEFI
=SSD_BOOTEFI
=SSD_BOOTEFI
WD8PRO1_P1
=SSD_BOOTEFI
WD8PRO1_P2
=SSD_BOOTEFI
=SSD_BOOTEFI
WD8PRO2
=SSD_BOOTEFI
=SSD_BOOTEFI
=SSD_BOOTEFI
=SSD_BOOTEFI
windows_10
=SSD_BOOTEFI
=SSD_BOOTEFI
SSD_BOOTEFI
=SSD_BOOTEFI
=SSD_BOOTEFI
LM_21_SSD
=SSD_BOOTEFI
U_20.04_SSD
=SSD_BOOTEFI
U_22.budgie_SSD
=SSD_BOOTEFI
U_24.04_SSD
=SSD_BOOTEFI
LM_SSD_NEW
=SSD_BOOTEFI
DEBIAN_XFCE
=SSD_BOOTEFI
Archlinux
=SSD_BOOTEFI
SSD_BOOTEFI
=SSD_BOOTEFI
Voulez-vous procéder au montage maintenant pour la partition « /dev/nvme0n1p12 » en y mettant pour étiquette « SSD_BOOTEFI » ? [O/n]
Dernière modification par iznobe (Le 28/04/2025, à 16:04)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#321 Le 28/04/2025, à 16:16
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
mapfile labels < <(lsblk -no label) if [ -n "${labels[0]}" ]; then for lab in "${labels[@]}"; do
avec shopt -s nullglob (à ajouter au début du script), puisqu'il n'y a pas de el(se/if; else), tu peux te dispenser du if test -n "${labels[0]}" : la boucle ne sera pas effectuée quand elle n'aura pas de liste sur laquelle itérer.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#322 Le 28/04/2025, à 16:21
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
Salut et merci Watael .
Peut etre , mais comme ça ne marche pas ... chaque chose en son temps .
Sais tu pour quoi la condition n' est pas validée ?
if [[ "$lab" == "$newLabel" ]]; then
echo "OK"
...
alors que le echo de la boucle me sort bien :
SSD_BOOTEFI
=SSD_BOOTEFI
Dernière modification par iznobe (Le 28/04/2025, à 16:27)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#323 Le 28/04/2025, à 16:40
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
mapfile -t labels, sinon il y a un alinéa à la fin de chaque élément du tableau. :
$ mapfile < <(printf '%s\n' foo bar baz)
$ for i in "${MAPFILE[@]}"; do echo ">$i<"; done
>foo
<
>bar
<
>baz
<
$
-t Retire les retours à la ligne de chaque ligne lue.
Dernière modification par Watael (Le 28/04/2025, à 16:42)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#324 Le 28/04/2025, à 18:17
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
si j' ajoute " -t " , il n' y a pas de tableau ...
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#325 Le 28/04/2025, à 19:31
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
fait voir un
mapfile -t labels < <(lsblk -no label)
for i in ${!labels[@]}; do echo "$i - ${labels[i]}"; done
Connected \o/
Welcome to sHell. · eval is evil.
En ligne