Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#351 Le 30/04/2025, à 07:41

Watael

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

mouais, declare -n et pas declare -na.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#352 Le 30/04/2025, à 07:54

Watael

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

je pense qu'il est temps de réécrire complètement ton script au propre, parce que depuis que tu l'as commencé, et avec tous les petits bouts ajoutés, il ressemble à un patchwork cousu avec du fil d'araignée. Et je déteste ça, le patchwork. smile


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#353 Le 30/04/2025, à 07:55

iznobe

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

bon voilà une version qui devrait te plaire un peu plus :

#!/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
    for i in ${!ListPart[*]}; do
      if [[ $i == *,3 && ${ListPart[$i]} == "$newLabel" ]]; then
        echo "Erreur, votre étiquette « $newLabel » est déjà attribuée ! Choisissez-en une autre."
        unset newLabel
        break
      fi
    done
  done
}

delMountPoints() {
  local rgx="^(/mnt/|/media/).+$"
  # 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
  fi
  sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
  sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
}

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."
  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 !"
        echo "les lignes contenant cet UUID seront supprimées du fichier /etc/fstab si vous poursuivez"
        q=1
      elif grep -Eq "(LABEL=|/dev/disk/by-label/)$newLabel" /etc/fstab; then
        echo "L’étiquette « $newLabel » est déjà utilisée dans le fstab !"
        echo "les lignes contenant ce LABEL seront supprimées du fichier /etc/fstab si vous poursuivez"
        q=1
      elif grep -q "^$Part" /etc/mtab; then
        echo "La partition « $Part » est déjà montée !"
        echo "la partition sera demontée , le fichier /etc/fstab nettoyé , et la partition sera à nouveau montée si vous poursuivez"
        q=1
      fi

      while ((q=1)); do
        read -rp "Etes-vous SÛR de vouloir procéder au montage 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|"")
            break
          ;;
          *)
          ;;
        esac
      done

      # sauvegarde
      echo "sauvegarde du fichier « /etc/fstab » en « /etc/fstab.BaK » avant modifications"
      cp /etc/fstab /etc/fstab.BaK

      # nettoyage
      delMountPoints

      # 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 »."
        sudo -u "$SUDO_USER" xdg-open "/media/$newLabel/$SUDO_USER-$newLabel" >/dev/null 2>&1
      else
        echo "Erreur inconnue !"
        exit 4
      fi
      break
    ;;
    *)
    ;;
  esac
done


oui ba maintenant qu ' il est fini , autant repartir de zero tongue

Dernière modification par iznobe (Le 30/04/2025, à 07:58)

Hors ligne

#354 Le 30/04/2025, à 08:17

iznobe

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

bon et cette fois la version finale :

#!/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

chooseLabel() {
  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
    for i in ${!ListPart[*]}; do
      if [[ $i == *,3 && ${ListPart[$i]} == "$newLabel" ]]; then
        echo "Erreur, votre étiquette « $newLabel » est déjà attribuée ! Choisissez-en une autre."
        unset newLabel
        break
      fi
    done
  done
}

delMountPoints() {
    local rgx="^(/mnt/|/media/).+$"
    declare -n parts=$1
    for part in "${parts[@]}"; do
        if test "$1" = 'mountedParts'; then umount -v "$part"; fi
        if [ -d "$part" ]; then
            if [[ $part =~ $rgx ]]; then
                rmdir -v "$part"
            else
                echo "$part a été conservé."
            fi
        fi
        mapfile -t numLines < <(grep -n "$part" /etc/fstab | cut -d ":" -f 1 | sort -rn)
        for n in "${numLines[@]}"; do
            sed -i "${n}d" /etc/fstab
        done
    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."
  chooseLabel
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|"")
        chooseLabel
        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 !"
        echo "les lignes contenant cet UUID seront supprimées du fichier /etc/fstab si vous poursuivez"
        q=1
      elif grep -Eq "(LABEL=|/dev/disk/by-label/)$newLabel" /etc/fstab; then
        echo "L’étiquette « $newLabel » est déjà utilisée dans le fstab !"
        echo "les lignes contenant ce LABEL seront supprimées du fichier /etc/fstab si vous poursuivez"
        q=1
      elif grep -q "^$Part" /etc/mtab; then
        echo "La partition « $Part » est déjà montée !"
        echo "la partition sera demontée , le fichier /etc/fstab nettoyé , et la partition sera à nouveau montée si vous poursuivez"
        q=1
      fi

      while ((q=1)); do
        read -rp "Etes-vous SÛR de vouloir procéder au montage 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|"")
            break
          ;;
          *)
          ;;
        esac
      done

      # sauvegarde
      echo "sauvegarde du fichier « /etc/fstab » en « /etc/fstab.BaK » avant modifications"
      cp /etc/fstab /etc/fstab.BaK

      # nettoyage
      # traitement des partitions montées
      mapfile -t mountedParts < <(grep "$Part" /etc/mtab | cut -d ' ' -f 2)
      delMountPoints mountedParts
      # traitement des partitions NON montées
      mapfile -t unmountedParts < <(grep -E "^(LABEL=|/dev/disk/by-label/)$PartLabel" /etc/fstab | cut -d ' ' -f 2)
      delMountPoints unmountedParts
      sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
      sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.

      # 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 !"
        umount -v /media/"$newLabel"
        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 »."
        sudo -u "$SUDO_USER" xdg-open "/media/$newLabel/$SUDO_USER-$newLabel" >/dev/null 2>&1
      else
        echo "Erreur inconnue !"
        exit 4
      fi
      break
    ;;
    *)
    ;;
  esac
done

Dernière modification par iznobe (Le 30/04/2025, à 08:27)

Hors ligne

#355 Le 30/04/2025, à 08:25

Watael

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

"fini", ça ne veut pas dire "bien fait".


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#356 Le 30/04/2025, à 08:45

iznobe

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

certes , mais re organiser les " etapes " , ajouter la sauvegarde du fichier fstab et ajouter la question de confirmation supplémentaire en cas de détection d ' anomalies .

ce n' est peut être pas "bien fait" , mais c' est déjà pas si mal . je trouve qu il couvre bien plus que la majorité des cas , pour ne pas dire tous les cas envisageables grace à l' aide des contributeurs sur ce post  que je remercient encore à nouveau pour leur aide d ' ailleurs .
et de mon propre chef , je n' arriverais pas en faire la moitié de toute manière .

veux tu l' accès au github pour modifier et que je crée une version de dev ?

Dernière modification par iznobe (Le 30/04/2025, à 14:39)

Hors ligne

#357 Le 27/08/2025, à 17:25

iznobe

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

Bonjour , dans le cas où une étiquette invalide a été entrée avant le script , comme c' est le cas dans cette discussion : https://forum.ubuntu-fr.org/viewtopic.php?id=2092259

Cela parait il correct pour palier de façon sûre au problème qui n' était pas géré auparavant par le 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
checkLabel () {
local rgx="[^[:alnum:]_-.]"
test -n "$1" && newLabel="$1"

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
    for i in ${!ListPart[*]}; do
      if [[ $i == *,3 && ${ListPart[$i]} == "$newLabel" ]]; then
        echo "Erreur, votre étiquette « $newLabel » est déjà attribuée ! Choisissez-en une autre."
        unset newLabel
        break
      fi
    done
}

chooseLabel() {
  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
    checkLabel
  done
}

delMountPoints() {
    local rgx="^(/mnt/|/media/).+$"
    declare -n parts=$1
    for part in "${parts[@]}"; do
        if test "$1" = 'mountedParts'; then umount -v "$part"; fi
        if [ -d "$part" ]; then
            if [[ $part =~ $rgx ]]; then
                rmdir -v "$part"
            else
                echo "$part a été conservé."
            fi
        fi
        mapfile -t numLines < <(grep -n "$part" /etc/fstab | cut -d ":" -f 1 | sort -rn)
        for n in "${numLines[@]}"; do
            sed -i "${n}d" /etc/fstab
        done
    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 test -z "$PartLabel" -a ; then
  echo "La partition « $Part » n’a pas d’étiquette."
  chooseLabel
else
  echo "La partition « $Part » a l’étiquette « $PartLabel »."
  if ! checkLabel "$PartLabel";then
    echo "étiquette incorrecte ! vous devez choisir une étiquette valide"
    chooseLabel
  fi

  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|"")
        chooseLabel
        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 !"
        echo "les lignes contenant cet UUID seront supprimées du fichier /etc/fstab si vous poursuivez"
        q=1
      elif grep -Eq "(LABEL=|/dev/disk/by-label/)$newLabel" /etc/fstab; then
        echo "L’étiquette « $newLabel » est déjà utilisée dans le fstab !"
        echo "les lignes contenant ce LABEL seront supprimées du fichier /etc/fstab si vous poursuivez"
        q=1
      elif grep -q "^$Part" /etc/mtab; then
        echo "La partition « $Part » est déjà montée !"
        echo "la partition sera demontée , le fichier /etc/fstab nettoyé , et la partition sera à nouveau montée si vous poursuivez"
        q=1
      fi

      while ((q=1)); do
        read -rp "Etes-vous SÛR de vouloir procéder au montage 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|"")
            break
          ;;
          *)
          ;;
        esac
      done

      # sauvegarde
      echo "sauvegarde du fichier « /etc/fstab » en « /etc/fstab.BaK » avant modifications"
      cp /etc/fstab /etc/fstab.BaK

      # nettoyage
      # traitement des partitions montées
      mapfile -t mountedParts < <(grep "$Part" /etc/mtab | cut -d ' ' -f 2)
      delMountPoints mountedParts
      # traitement des partitions NON montées
      mapfile -t unmountedParts < <(grep -E "^(LABEL=|/dev/disk/by-label/)$PartLabel" /etc/fstab | cut -d ' ' -f 2)
      delMountPoints unmountedParts
      sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
      sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.

      # 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 !"
        umount -v /media/"$newLabel"
        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 »."
        sudo -u "$SUDO_USER" xdg-open "/media/$newLabel/$SUDO_USER-$newLabel" >/dev/null 2>&1
      else
        echo "Erreur inconnue !"
        exit 4
      fi
      break
    ;;
    *)
    ;;
  esac
done

Hors ligne

#358 Le 28/08/2025, à 00:32

iznobe

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

Finalement , apres test , j ' ai apporté de nouvelles modifications pour que cela fonctionne :

#!/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
checkLabel () {
local rgx="[^[:alnum:]_-.]"
test -n "$1" && newLabel="$1"

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
if test -z "$1";  then
  for i in ${!ListPart[*]}; do
    if [[ $i == *,3 && ${ListPart[$i]} == "$newLabel" ]]; then
      echo "Erreur, votre étiquette « $newLabel » est déjà attribuée ! Choisissez-en une autre."
      unset newLabel
      break
    fi
  done
fi
}

chooseLabel() {
  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
    checkLabel
  done
}

delMountPoints() {
    local rgx="^(/mnt/|/media/).+$"
    declare -n parts=$1
    for part in "${parts[@]}"; do
        if test "$1" = 'mountedParts'; then umount -v "$part"; fi
        if [ -d "$part" ]; then
            if [[ $part =~ $rgx ]]; then
                rmdir -v "$part"
            else
                echo "$part a été conservé."
            fi
        fi
        mapfile -t numLines < <(grep -n "$part" /etc/fstab | cut -d ":" -f 1 | sort -rn)
        for n in "${numLines[@]}"; do
            sed -i "${n}d" /etc/fstab
        done
    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 test -z "$PartLabel";then
  echo "La partition « $Part » n’a pas d’étiquette."
  chooseLabel
elif checkLabel "$PartLabel"; then
    echo "La partition « $Part » a l’étiquette « $PartLabel »."
    echo "étiquette incorrecte ! vous devez choisir une étiquette valide."
    unset newLabel
    chooseLabel
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|"")
        chooseLabel
        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 !"
        echo "les lignes contenant cet UUID seront supprimées du fichier /etc/fstab si vous poursuivez"
        q=1
      elif grep -Eq "(LABEL=|/dev/disk/by-label/)$newLabel" /etc/fstab; then
        echo "L’étiquette « $newLabel » est déjà utilisée dans le fstab !"
        echo "les lignes contenant ce LABEL seront supprimées du fichier /etc/fstab si vous poursuivez"
        q=1
      elif grep -q "^$Part" /etc/mtab; then
        echo "La partition « $Part » est déjà montée !"
        echo "la partition sera demontée , le fichier /etc/fstab nettoyé , et la partition sera à nouveau montée si vous poursuivez"
        q=1
      fi

      while ((q=1)); do
        read -rp "Etes-vous SÛR de vouloir procéder au montage 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|"")
            break
          ;;
          *)
          ;;
        esac
      done

      # sauvegarde
      echo "sauvegarde du fichier « /etc/fstab » en « /etc/fstab.BaK » avant modifications"
      cp /etc/fstab /etc/fstab.BaK

      # nettoyage
      # traitement des partitions montées
      mapfile -t mountedParts < <(grep "$Part" /etc/mtab | cut -d ' ' -f 2)
      delMountPoints mountedParts
      # traitement des partitions NON montées
      mapfile -t unmountedParts < <(grep -E "^(LABEL=|/dev/disk/by-label/)$PartLabel" /etc/fstab | cut -d ' ' -f 2)
      delMountPoints unmountedParts
      sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
      sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.

      # 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 !"
        umount -v /media/"$newLabel"
        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 »."
        sudo -u "$SUDO_USER" xdg-open "/media/$newLabel/$SUDO_USER-$newLabel" >/dev/null 2>&1
      else
        echo "Erreur inconnue !"
        exit 4
      fi
      break
    ;;
    *)
    ;;
  esac
done

Dernière modification par iznobe (Le 28/08/2025, à 00:41)

Hors ligne

#359 Le 28/08/2025, à 11:22

iznobe

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

bon , et bien ca ne fonctionne toujours pas .

Je sais pas pourquoi , mais je n' arrive pas a " recuperer " une sortie de la fonction ( j ' ai essayer avec " return " et tout un tas de truc ) pour faire en sorte que la condition fonctionne dans le cas ou une étiquette valide / invalide est déjà présente ...

le probleme est peut etre dans la regex ?

exemple de retour :

iznobe@iznobe-pc:~$ sudo bash Scripts/automount_part_data.sh

  n°  ⇒    path     label     fstype     mountpoint
-----------------------------------------------------------------
 1  ⇒ /dev/sda1   Seagate/4T   ext4   
...

Choisissez le numéro correspondant à votre future partition de données : 1
La partition « /dev/sda1 » a l’étiquette « Seagate/4T ».
Voulez-vous changer l’étiquette de la partition « /dev/sda1 » ? [O/n] n
iznobe@iznobe-pc:~$ 

un " / " devrait etre considéré comme un caractere non accepté , à priori ce n' est pas le cas .

Dernière modification par iznobe (Le 28/08/2025, à 12:38)

Hors ligne

#360 Le 28/08/2025, à 12:49

iznobe

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

test avec le code suivant :

#!/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
checkLabel () {
local rgx="[^[:alnum:]_-/.]"
#local rgx="abcdefghijklmnopqrstuvwxyz_-.ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"
test -n "$1" && newLabel="$1"
echo "$newLabel"
#(( $#>0 )) && newLabel="$1"
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
    return 1
  else
    return 0
fi
}
checkLabel "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa"

echo "$?"

quelques retours :

iznobe@iznobe-pc:~$ sudo bash Scripts/testeur.sh
/
0
iznobe@iznobe-pc:~$ sudo bash Scripts/testeur.sh
a
0
iznobe@iznobe-pc:~$ sudo bash Scripts/testeur.sh
aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Le nom de votre étiquette comporte une espace, un accent ou un caractère spécial ou plus de 16 caractères !
1
iznobe@iznobe-pc:~$ sudo bash Scripts/testeur.sh
!
0
iznobe@iznobe-pc:~$ sudo bash Scripts/testeur.sh
é
0
iznobe@iznobe-pc:~$ sudo bash Scripts/testeur.sh
%
0
iznobe@iznobe-pc:~$ 

la regex ne convient pas ...

Hors ligne

#361 Le 28/08/2025, à 13:07

nany

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

Bonjour,



Du mal à remettre le nez dedans mais,

iznobe a écrit :

un " / " devrait etre considéré comme un caractere non accepté , à priori ce n' est pas le cas .

Le point désignant n’importe quel caractère, « / » est logiquement accepté.

Essaie :

local rgx="[^[:alnum:]_-\.]"

Hors ligne

#362 Le 28/08/2025, à 13:32

iznobe

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

j ' ai deja essayé mais non ...
Par contre , je viens de trouver qu ' avec :

local rgx="[^[:alnum:]_.-]"

là ca fonctionne ... le point en dernier emplacement avant un crochet a une signification particulière ? et si il n' est pas juste avant le crochet une autre ?

voici ce que j' ai pondu :

#!/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

err() {
    >&2 echo -e "\\033[1;31m Erreur : $* \\033[0;0m"
}

checkLabel() {
test -n $1 || exit
#local rgx="[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.-]"
local rgx="[^[:alnum:]_.-]"
if [[ $1 =~ $rgx || ${#1} -gt 16 ]]; then
    unset PartLabel
    return 1
fi
}

chooseLabel() {
  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
      err "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
    for i in ${!ListPart[*]}; do
      if [[ $i == *,3 && ${ListPart[$i]} == "$newLabel" ]]; then
        err "votre étiquette « $newLabel » est déjà attribuée ! Choisissez-en une autre."
        unset newLabel
        break
      fi
    done
  done
}

delMountPoints() {
    local rgx="^(/mnt/|/media/).+$"
    declare -n parts=$1
    for part in "${parts[@]}"; do
        if test "$1" = 'mountedParts'; then umount -v "$part"; fi
        if [ -d "$part" ]; then
            if [[ $part =~ $rgx ]]; then
                rmdir -v "$part"
            else
                echo "$part a été conservé."
            fi
        fi
        mapfile -t numLines < <(grep -n "$part" /etc/fstab | cut -d ":" -f 1 | sort -rn)
        for n in "${numLines[@]}"; do
            sed -i "${n}d" /etc/fstab
        done
    done
}

if ((UID)); then
  err "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo $0 »)."
  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
  err "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
    err "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 test -z "$PartLabel";then
  echo "La partition « $Part » n’a pas d’étiquette."
  chooseLabel
else
  echo "La partition « $Part » a l’étiquette « $PartLabel »."
  checkLabel "$PartLabel"
  if (( $? == 1 )); then
    err "étiquette invalide !"
    unset newLabel
    chooseLabel
  else
    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|"")
          chooseLabel
          break
        ;;
        *)
        ;;
      esac
    done
  fi
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)
      err "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 !"
        echo "le fichier /etc/fstab sera mis à jour si vous poursuivez"
        q=1
      elif grep -Eq "(LABEL=|/dev/disk/by-label/)$newLabel" /etc/fstab; then
        echo "L’étiquette « $newLabel » est déjà utilisée dans le fstab !"
        echo "le fichier /etc/fstab sera mis à jour si vous poursuivez"
        q=1
      elif grep -q "^$Part" /etc/mtab; then
        echo "La partition « $Part » est déjà montée !"
        echo "la partition sera démontée , le fichier /etc/fstab sera mis à jour si vous poursuivez"
        q=1
      fi

      while ((q=1)); do
        read -rp "Etes-vous SÛR de vouloir procéder au montage pour la partition « $Part » en y mettant pour étiquette « $newLabel » ? [O/n] "
        case "$REPLY" in
          N|n)
            err "Annulation par l’utilisateur !"
            exit 0
          ;;
          Y|y|O|o|"")
            break
          ;;
          *)
          ;;
        esac
      done

      # sauvegarde
      echo "sauvegarde du fichier « /etc/fstab » en « /etc/fstab.BaK » avant modifications"
      cp /etc/fstab /etc/fstab.BaK

      # nettoyage
      # traitement des partitions montées
      mapfile -t mountedParts < <(grep "$Part" /etc/mtab | cut -d ' ' -f 2)
      delMountPoints mountedParts
      # traitement des partitions NON montées
      mapfile -t unmountedParts < <(grep -E "^(LABEL=|/dev/disk/by-label/)$PartLabel" /etc/fstab | cut -d ' ' -f 2)
      delMountPoints unmountedParts
      sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
      sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.

      # 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
        err "inattendue , annulation des modifications !"
        umount -v /media/"$newLabel"
        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 "Création de la corbeille réussie"
        echo "-----------------------------------------------------------------"
        echo -e "\\033[1;34m Script pour montage de partition de données terminé avec succès ! \\033[0;0m"
        echo
        echo -e "\\033[1;34m Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/$newLabel/$SUDO_USER-$newLabel » . \\033[0;0m"
        sudo -u "$SUDO_USER" xdg-open "/media/$newLabel/$SUDO_USER-$newLabel" >/dev/null 2>&1
      else
        err "inconnue !"
        exit 4
      fi
      break
    ;;
    *)
    ;;
  esac
done

ce n' est peut être pas idéal , mais au moins ( je pense ) que ça fonctionne .

j ' ai actualisé github .

Dernière modification par iznobe (Le 29/08/2025, à 00:37)

Hors ligne

#363 Le 29/08/2025, à 19:11

RaphaelG

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

Une petite mise au point sur les regexes :
A l'intérieure d'une "bracket expression" (un truc du genre [.....], mes tentatives de traduire cette expression en français ne m'ont pas satisfait. Dans la littérature on voit aussi "character class" mais dans "man 7 regex" on n'utilise que "bracket expression") les caractères perdent leur propriété spéciale. Ainsi le '.' qui est normalement un joker (wildcard) pouvant toucher n'importe quel caractère, perd cette propriété pour prendre sa valeur littérale. C'est d'ailleurs ce que tu souhaites dans le cas qui nous intéresse.
Mais le '-' est un métacaractère pour les bracket expressions. Il est utilisé pour créer un intervalle. Ainsi, le motif "[0-9]" touche tous les chiffres du système décimal.
Si on veut utiliser le caractère '-' pour sa valeur littérale alors il faut le mettre soit juste derrière le caractère '[' ou juste derrrière la  séquence "[^" ou juste devant le caractère ']'.
Les motifs correspondants à ta recherche sont multiples. Outre "[^[:alnum:]_.-]" que tu as trouvé, il y a aussi "[^-[:alnum:]_.]" et plein d'autres combinaisons car l'ordre entre "[:alpnum;]", '_' et '.' n'a pas d'importance.

Hors ligne

#364 Le 29/08/2025, à 19:34

iznobe

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

Salut RaphaelG , merci pour cette explication , maintenant , je comprends mieux pourquoi ça fonctionne l ' expression que j' ai trouvée , un peu au pif , faut l' avouer ...
le truc c ' était pas le point mais le tiret qui faisait que ca merdoyait ...

Bon , j ' ai toujours un peu galérer avec les regex ( même si c' est pas le seul point avec lequel je galère big_smile )
il faudrait que je pratique bien plus souvent pour que je n ' oublie pas , tout le problème est là ...

Hors ligne

#365 Le 17/09/2025, à 07:49

iznobe

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

Bonjour , on pourrait facilement faire en sorte que ce script soit aussi utile pour les partitions externes .
il suffit de ne rien ajouter au fstab , ou bien de mettre les options qui font en sortent que ca ne bloque pas et ne ralenti pas le demarrage .

je sais , mais je ne retrouve plus , qu ' une commande permet de voir si le disque est detecté comme externe ou interne , une idée de comment obtenir l ' info ?

Hors ligne

#366 Le 17/09/2025, à 07:55

iznobe

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

Bonjour , on pourrait facilement faire en sorte que ce script soit aussi utile pour les partitions externes .
il suffit de ne rien ajouter au fstab , ou bien de mettre les options qui font en sortent que ca ne bloque pas et ne ralenti pas le demarrage .

je sais , mais je ne retrouve plus , qu ' une commande permet de voir si le disque est detecté comme externe ou interne , une idée de comment obtenir l ' info ?

il semblerait qu ' avec lsblk , ce soit la donnée HOTPLUG a 1 ?

Hors ligne

#367 Le 17/09/2025, à 08:39

O_20_100_O

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

iznobe a écrit :

il semblerait qu ' avec lsblk , ce soit la donnée HOTPLUG a 1 ?

Effectivement, le man contient :

 HOTPLUG <boolean>       périphérique amovible ou connectable à chaud (USB, PCMCIA, etc.)

Et ça se vérifie chez moi, les disques internes sont à 0 et une clé USB à 1.

Hors ligne

#368 Le 17/09/2025, à 08:53

iznobe

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

Bon , voilà la prise en charge de partitions de disque durs externe , a tester une peu plus en profondeur  :

#!/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

err() {
    >&2 echo -e "\\033[1;31m Erreur : $* \\033[0;0m"
}

checkLabel() {
test -n $1 || exit
#local rgx="[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.-]"
local rgx="[^[:alnum:]_.-]"
if [[ $1 =~ $rgx || ${#1} -gt 16 ]]; then
    unset PartLabel
    return 1
fi
}

chooseLabel() {
  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
      err "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
    for i in ${!ListPart[*]}; do
      if [[ $i == *,3 && ${ListPart[$i]} == "$newLabel" ]]; then
        err "votre étiquette « $newLabel » est déjà attribuée ! Choisissez-en une autre."
        unset newLabel
        break
      fi
    done
  done
}

delMountPoints() {
    local rgx="^(/mnt/|/media/).+$"
    declare -n parts=$1
    for part in "${parts[@]}"; do
        if test "$1" = 'mountedParts'; then umount -v "$part"; fi
        if [ -d "$part" ]; then
            if [[ $part =~ $rgx ]]; then
                rmdir -v "$part"
            else
                echo "$part a été conservé."
            fi
        fi
        mapfile -t numLines < <(grep -n "$part" /etc/fstab | cut -d ":" -f 1 | sort -rn)
        for n in "${numLines[@]}"; do
            sed -i "${n}d" /etc/fstab
        done
    done
}

if ((UID)); then
  err "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo $0 »)."
  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 hotplug mountpoint label
  if [[ ${lsblkDT[1]} =~ ${Rgx[fstype]} ]]; then
    if [[ ${lsblkDT[2]} =~ ${Rgx[mountP]} ]]; then
      continue
    else
      ((++i))
      ListPart[$i,0]="${lsblkDT[0]}" # path
      ListPart[$i,1]="${lsblkDT[1]}" # fstype
      ListPart[$i,2]="${lsblkDT[2]}" # hotplug
      if [[ ${lsblkDT[3]} =~ ^/ ]]; then # si mount point non vide
        ListPart[$i,3]="${lsblkDT[3]}" # mountpoint
        ListPart[$i,4]="${lsblkDT[4]}" # label
      else # si mount point est vide on decale la sortie avec une colonne en moins
        ListPart[$i,3]="             " # mountpoint vide
        ListPart[$i,4]="${lsblkDT[3]}" # label passe en indice 3 à la place du mountpoint
      fi
    fi
  fi
done < <(lsblk -no path,fstype,hotplug,mountpoint,label)

if ((${#ListPart[@]} == 0)); then
  err "il n’y a pas de partition susceptible d’être montée."
  exit 2
fi

nbDev=$(("${#ListPart[@]}"/5))

          echo             # 0        1           2             3             4
          echo "  n°  ⇒    path     fstype  externe/interne     mountpoint    label"
echo "-----------------------------------------------------------------------------"
for (( n=0; n<nbDev; n++ )); do
  if ((n+1 < 10)); then
    echo "  $((n+1))   ⇒ ${ListPart[$n,0]}    ${ListPart[$n,1]}           ${ListPart[$n,2]}       ${ListPart[$n,3]}      ${ListPart[$n,4]}"
  else
    echo "  $((n+1))  ⇒ ${ListPart[$n,0]}    ${ListPart[$n,1]}           ${ListPart[$n,2]}       ${ListPart[$n,3]}      ${ListPart[$n,4]}"
  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
    err "votre choix doit être un nombre entier compris entre 1 et $nbDev."
    unset PartNum
  fi
done

Part="${ListPart[$((PartNum-1)),0]}"
PartFstype="${ListPart[$((PartNum-1)),1]}"
PartPlug="${ListPart[$((PartNum-1)),2]}"
PartLabel="${ListPart[$((PartNum-1)),4]}"

if test -z "$PartLabel";then
  echo "La partition « $Part » n’a pas d’étiquette."
  chooseLabel
else
  echo "La partition « $Part » a l’étiquette « $PartLabel »."
  checkLabel "$PartLabel"
  if (( $? == 1 )); then
    err "étiquette invalide !"
    unset newLabel
    chooseLabel
  else
    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|"")
          chooseLabel
          break
        ;;
        *)
        ;;
      esac
    done
  fi
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)
      err "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 !"
        echo "le fichier /etc/fstab sera mis à jour si vous poursuivez"
        q=1
      elif grep -Eq "(LABEL=|/dev/disk/by-label/)$newLabel" /etc/fstab; then
        echo "L’étiquette « $newLabel » est déjà utilisée dans le fstab !"
        echo "le fichier /etc/fstab sera mis à jour si vous poursuivez"
        q=1
      elif grep -q "^$Part" /etc/mtab; then
        echo "La partition « $Part » est déjà montée !"
        echo "la partition sera démontée , le fichier /etc/fstab sera mis à jour si vous poursuivez"
        q=1
      fi

      while ((q=1)); do
        read -rp "Etes-vous SÛR de vouloir procéder au montage pour la partition « $Part » en y mettant pour étiquette « $newLabel » ? [O/n] "
        case "$REPLY" in
          N|n)
            err "Annulation par l’utilisateur !"
            exit 0
          ;;
          Y|y|O|o|"")
            break
          ;;
          *)
          ;;
        esac
      done

      # sauvegarde
      echo "sauvegarde du fichier « /etc/fstab » en « /etc/fstab.BaK » avant modifications"
      cp /etc/fstab /etc/fstab.BaK

      # nettoyage
      # traitement des partitions montées
      mapfile -t mountedParts < <(grep "$Part" /etc/mtab | cut -d ' ' -f 2)
      delMountPoints mountedParts
      # traitement des partitions NON montées
      mapfile -t unmountedParts < <(grep -E "^(LABEL=|/dev/disk/by-label/)$PartLabel" /etc/fstab | cut -d ' ' -f 2)
      delMountPoints unmountedParts
      sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
      sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.

      # construction des éléments :
      if [[ $PartFstype =~ ^ext[2-4] ]]; then
        e2label "$Part" "$newLabel"
        if ((PartPlug==0)); then echo "LABEL=$newLabel /media/$newLabel $PartFstype defaults,nofail,x-systemd.device-timeout=1" >> /etc/fstab; fi
      elif [ $PartFstype == "ntfs" ]; then
        ntfslabel  "$Part" "$newLabel"
        if ((PartPlug==0)); then # partition interne
          if dpkg-query -l ntfs-3g | grep -q "^[hi]i"; then
            echo "LABEL=$newLabel /media/$newLabel ntfs-3g defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
          else
            echo "LABEL=$newLabel /media/$newLabel ntfs defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
          fi
        fi
      fi
      if ! [ -d /media/"$newLabel" ]; then
        mkdir -v /media/"$newLabel"
      fi
      systemctl daemon-reload
      if ! mount -a; then
        err "inattendue , annulation des modifications !"
        mv -v /etc/fstab.BaK /etc/fstab # il faut enlever la ligne qui a étée ajouter au fstab
        umount -v /media/"$newLabel"
        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 "Création de la corbeille réussie"
        echo "-----------------------------------------------------------------"
        echo -e "\\033[1;34m Script pour montage de partition de données terminé avec succès ! \\033[0;0m"
        echo
        echo -e "\\033[1;34m Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/$newLabel/$SUDO_USER-$newLabel » . \\033[0;0m"
        sudo -u "$SUDO_USER" xdg-open "/media/$newLabel/$SUDO_USER-$newLabel" >/dev/null 2>&1
      else
        err "inconnue !"
        exit 4
      fi
      break
    ;;
    *)
    ;;
  esac
done

Dernière modification par iznobe (Le 18/09/2025, à 11:56)

Hors ligne

#369 Le 18/09/2025, à 11:56

iznobe

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

Bonjour ,
curieusement , je viens de remarquer que la partition racine n ' est pas exclue de la liste ...

Hors ligne

#370 Le 27/09/2025, à 09:49

iznobe

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

Bonjour , il reste un dernier petit soucis à regler , la propo 14 :

iznobe@iznobe-pc:~$ sudo bash Scripts/automount_part_data.sh
[sudo] Mot de passe de iznobe : 

  n°  ⇒    path     fstype  externe/interne     mountpoint     label
-----------------------------------------------------------------------------
  1   ⇒ /dev/sda1    ext4          0                          Seagate_4T
  2   ⇒ /dev/sda4    ext3          0                          ubuntu_24.04
  3   ⇒ /dev/sdb1    ext4          0       /media/Videos/WD8      WD8
  4   ⇒ /dev/sdb2    ext4          0                          SAUV
  5   ⇒ /dev/sdc3    ext4          0       /datas      Data
  6   ⇒ /dev/sdd1    ext4          0       /media/WD8PRO1_P1      WD8PRO1_P1
  7   ⇒ /dev/sdd2    ext4          0       /media/Videos/WD8PRO1_P2      WD8PRO1_P2
  8   ⇒ /dev/sde1    ext4          0       /media/Videos/WD8PRO2      WD8PRO2
  9   ⇒ /dev/nvme0n1p1    ntfs          0                          windows_10
  10  ⇒ /dev/nvme0n1p3    ext4          0                          Arch
  11  ⇒ /dev/nvme0n1p5    ext4          0                          LM_21_SSD
  12  ⇒ /dev/nvme0n1p6    ext4          0                          U_20.04_SSD
  13  ⇒ /dev/nvme0n1p7    ext4          0                          U_22.budgie_SSD
  14  ⇒ /dev/nvme0n1p8    ext4          0       /      U_24.04_SSD
  15  ⇒ /dev/nvme0n1p9    ext4          0                          LM_SSD_NEW
  16  ⇒ /dev/nvme0n1p10    ext4          0                          DEBIAN_XFCE

Choisissez le numéro correspondant à votre future partition de données : 

EDIT : résolu  : bon , c' est lié a mes derniers changements , j' avais oublié d ' assortir le controle de la regex sur le bon champ ...

while read -ra lsblkDT; do #path fstype hotplug mountpoint label
  if [[ ${lsblkDT[1]} =~ ${Rgx[fstype]} ]]; then
    if [[ ${lsblkDT[3]} =~ ${Rgx[mountP]} ]]; then

Dernière modification par iznobe (Le 27/09/2025, à 10:15)

Hors ligne

#371 Le 12/10/2025, à 17:49

iznobe

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

Bonjour , voici ce sur quoi je suis arrivé pour finaliser dans un script ce qui est indiqué sur cette page : partitions_data
Si quelqu ' un veut tester le script au complet , presque finalisé ( j ' aimerais ajouté la restauration du fichier .config/user-dirs.dirs en cas d' echec de transfert , mais je ferai ça plus tard , perdu trop de temps avec l' histoire du AWK ... ) , le voici :

#!/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

err() {
    >&2 echo -e "\\033[1;31m Erreur : $* \\033[0;0m"
}

checkLabel() {
test -n $1 || exit
#local rgx="[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.-]"
local rgx="[^[:alnum:]_.-]"
if [[ $1 =~ $rgx || ${#1} -gt 16 ]]; then
    unset PartLabel
    return 1
fi
}

chooseLabel() {
  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
      err "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
    for i in ${!ListPart[*]}; do
      if [[ $i == *,3 && ${ListPart[$i]} == "$newLabel" ]]; then
        err "votre étiquette « $newLabel » est déjà attribuée ! Choisissez-en une autre."
        unset newLabel
        break
      fi
    done
  done
}

delMountPoints() {
    local rgx="^(/mnt/|/media/).+$"
    declare -n parts=$1
    for part in "${parts[@]}"; do
        if test "$1" = 'mountedParts'; then umount -v "$part"; fi
        if [ -d "$part" ]; then
            if [[ $part =~ $rgx ]]; then
                rmdir -v "$part"
            else
                echo "$part a été conservé."
            fi
        fi
        mapfile -t numLines < <(grep -n "$part" /etc/fstab | cut -d ":" -f 1 | sort -rn)
        for n in "${numLines[@]}"; do
            sed -i "${n}d" /etc/fstab
        done
    done
}

if ((UID)); then
  err "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo $0 »)."
  exit 1
fi
home="/home/$SUDO_USER"
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 hotplug mountpoint label
  if [[ ${lsblkDT[1]} =~ ${Rgx[fstype]} ]]; then
    if [[ ${lsblkDT[3]} =~ ${Rgx[mountP]} ]]; then
      continue
    else
      ((++i))
      ListPart[$i,0]="${lsblkDT[0]}" # path
      ListPart[$i,1]="${lsblkDT[1]}" # fstype
      ListPart[$i,2]="${lsblkDT[2]}" # hotplug
      if [[ ${lsblkDT[3]} =~ ^/ ]]; then # si mount point non vide
        ListPart[$i,3]="${lsblkDT[3]}" # mountpoint
        ListPart[$i,4]="${lsblkDT[4]}" # label
      else # si mount point est vide on decale la sortie avec une colonne en moins
        ListPart[$i,3]="             " # mountpoint vide
        ListPart[$i,4]="${lsblkDT[3]}" # label passe en indice 3 à la place du mountpoint
      fi
    fi
  fi
done < <(lsblk -no path,fstype,hotplug,mountpoint,label)

if ((${#ListPart[@]} == 0)); then
  err "il n’y a pas de partition susceptible d’être montée."
  exit 2
fi

nbDev=$(("${#ListPart[@]}"/5))

          echo             # 0        1           2             3             4
          echo "  n°  ⇒    path     fstype  externe/interne     mountpoint     label"
echo "-----------------------------------------------------------------------------"
for (( n=0; n<nbDev; n++ )); do
  if ((n+1 < 10)); then
    echo "  $((n+1))   ⇒ ${ListPart[$n,0]}    ${ListPart[$n,1]}          ${ListPart[$n,2]}       ${ListPart[$n,3]}      ${ListPart[$n,4]}"
  else
    echo "  $((n+1))  ⇒ ${ListPart[$n,0]}    ${ListPart[$n,1]}          ${ListPart[$n,2]}       ${ListPart[$n,3]}      ${ListPart[$n,4]}"
  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
    err "votre choix doit être un nombre entier compris entre 1 et $nbDev."
    unset PartNum
  fi
done

Part="${ListPart[$((PartNum-1)),0]}"
PartFstype="${ListPart[$((PartNum-1)),1]}"
PartPlug="${ListPart[$((PartNum-1)),2]}"
PartLabel="${ListPart[$((PartNum-1)),4]}"

if test -z "$PartLabel";then
  echo "La partition « $Part » n’a pas d’étiquette."
  chooseLabel
else
  echo "La partition « $Part » a l’étiquette « $PartLabel »."
  checkLabel "$PartLabel"
  if (( $? == 1 )); then
    err "étiquette invalide !"
    unset newLabel
    chooseLabel
  else
    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|"")
          chooseLabel
          break
        ;;
        *)
        ;;
      esac
    done
  fi
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)
      err "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 !"
        q=1
      fi
      if grep -Eq "(LABEL=|/dev/disk/by-label/)$newLabel" /etc/fstab; then
        echo "L’étiquette « $newLabel » est déjà utilisée dans le fstab !"
        q=1
      fi
      if grep -q "^$Part" /etc/mtab; then
        echo "La partition « $Part » est déjà montée !"
        q=1
      fi

      while ((q=1)); do
        echo "le fichier /etc/fstab sera mis à jour si vous poursuivez"
        read -rp "Etes-vous SÛR de vouloir procéder au montage pour la partition « $Part » en y mettant pour étiquette « $newLabel » ? [O/n] "
        case "$REPLY" in
          N|n)
            err "Annulation par l’utilisateur !"
            exit 0
          ;;
          Y|y|O|o|"")
            break
          ;;
          *)
          ;;
        esac
      done

      # sauvegarde
      echo "sauvegarde du fichier « /etc/fstab » en « /etc/fstab.BaK » avant modifications"
      cp /etc/fstab /etc/fstab.BaK

      # nettoyage
      # traitement des partitions montées
      mapfile -t mountedParts < <(grep "$Part" /etc/mtab | cut -d ' ' -f 2)
      delMountPoints mountedParts
      # traitement des partitions NON montées
      mapfile -t unmountedParts < <(grep -E "^(LABEL=|/dev/disk/by-label/)$PartLabel" /etc/fstab | cut -d ' ' -f 2)
      delMountPoints unmountedParts
      sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
      sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.

      # construction des éléments :
      if [[ $PartFstype =~ ^ext[2-4] ]]; then
        e2label "$Part" "$newLabel"
        if ((PartPlug==0)); then # partition interne
          echo "LABEL=$newLabel /media/$newLabel $PartFstype defaults" >> /etc/fstab
        else # partition externe EXT2/3/4
          echo "LABEL=$newLabel /media/$newLabel $PartFstype defaults,nofail,x-systemd.device-timeout=1" >> /etc/fstab
        fi
      elif [ "$PartFstype" == "ntfs" ]; then
        ntfslabel  "$Part" "$newLabel"
        if ((PartPlug==0)); then # partition interne
          if dpkg-query -l ntfs-3g | grep -q "^[hi]i"; then
            echo "LABEL=$newLabel /media/$newLabel ntfs-3g defaults,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
          else
            echo "LABEL=$newLabel /media/$newLabel ntfs defaults,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
          fi
        else # partition externe NTFS
          if dpkg-query -l ntfs-3g | grep -q "^[hi]i"; then
            echo "LABEL=$newLabel /media/$newLabel ntfs-3g defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
          else
            echo "LABEL=$newLabel /media/$newLabel ntfs defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
          fi
        fi
      fi

      part_data_path="/media/$newLabel"
      if ! [ -d "$part_data_path" ]; then
        mkdir -v "$part_data_path"
      fi
      systemctl daemon-reload
      if ! mount -a; then
        err "inattendue , annulation des modifications !"
        mv -v /etc/fstab.BaK /etc/fstab # il faut enlever la ligne qui a étée ajouter au fstab
        umount -v "$part_data_path"
        rmdir -v "$part_data_path"
        systemctl daemon-reload
        exit 3
      fi

      part_data_user_dir="/media/$newLabel/$SUDO_USER-$newLabel"
      if ! [ -d "$part_data_user_dir" ]; then
        mkdir -v "$part_data_user_dir"
      fi
      chown -c "$SUDO_USER": "$part_data_user_dir"

      trash_user_dir="$part_data_path"/.Trash-"$SUDO_UID"
      if ! [ -d "$trash_user_dir" ]; then
        mkdir -v "$trash_user_dir"
      fi
      chown -c "$SUDO_USER": "$trash_user_dir"
      chmod -c 700 "$trash_user_dir"

      if [ -d "$trash_user_dir" ]; then
        echo
        echo "Création de la corbeille réussie"
        echo -e "\\033[1;34m Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « $part_data_user_dir » . \\033[0;0m"
        echo
        echo "-----------------------------------------------------------------"
        echo
      else
        err "inconnue !"
        exit 4
      fi
      break
    ;;
    *)
    ;;
  esac
done

while true; do
  read -rp "Voulez-vous deplacer TOUTES vos données utilisateur dans la partition « $Part » qui vient d' être montée sur : « $part_data_user_dir » ?
  cette action peut durer très longtemps, ne pas interrompre pour éviter la perte des données . soyez patient svp !
  Lancer le déplacement de TOUTES les données maintenant ?  [O/n]"
  case "$REPLY" in
    N|n)
      err "Annulation par l’utilisateur !"
      exit 0
    ;;
    Y|y|O|o|"")
      xdg_conf_file="$home/.config/user-dirs.dirs"
      if test -f "$xdg_conf_file"; then
        # sauvegarde du fichier
        cp -v "$xdg_conf_file"  "$xdg_conf_file".BaK
        declare -A ListDir
        while read -ra xdg_dirs; do
          if [[ ${xdg_dirs[1]} != '$HOME' ]]; then
            continue
          elif test -z ${xdg_dirs[2]}; then
            continue
          elif test -d "$home/${xdg_dirs[2]}" -a "$home/${xdg_dirs[2]}" != "$home"; then
            ((++i))
            ListDir[$i,0]="${xdg_dirs[0]}" # = XDG_DESTOP_DIR=
            ListDir[$i,1]="${xdg_dirs[1]}" # = $HOME
            ListDir[$i,2]="${xdg_dirs[2]}" # = dossier de stockage personnel
          fi
        done < <(awk -F'["/]' '/^XDG/{print $1,$2,$3}' "$xdg_conf_file")

        if ((${#ListDir[@]} == 0)); then
          err "Aucune variable XDG valide a traiter !"
          exit 6
        else
          nbDev=$(("${#ListDir[@]}"/3))

          for (( n=0; n<nbDev; n++ )); do # ${ListDir[$n,0] = XDG_DESTOP_DIR= , ${ListDir[$n,1] = $HOME , ${ListDir[$n,2]} = dossier de stockage personnel
            name=${ListDir[$n,0]:4 :-5}
            xdg-user-dirs-update --set "$name" "$part_data_user_dir/${ListDir[$n,2]}"
          done
        fi
      else
        err "pas de fichier .config/user-dirs.dirs !"
        exit 5
      fi

      for elem in $home/*; do
        if test -d "$elem"; then
          mv -v "$elem" "$part_data_user_dir/" && ln -s "$part_data_user_dir/$elem"  "$home"
        else mv -v "$elem" "$part_data_user_dir"
        fi
      done

     # mv -v "$xdg_conf_file".BaK  "$xdg_conf_file"

    break
    ;;
    *)
    ;;
  esac
done
echo -e "\\033[1;34m Script pour montage de partition de données terminé avec succès ! \\033[0;0m"
#sudo -u "$SUDO_USER" xdg-open "/media/$newLabel/$SUDO_USER-$newLabel" >/dev/null 2>&1

Un conseil , faites une sauvegarde du fstab , parfois , sans que je comprenne bien pourquoi ,au cours de mes essais ( un peur farfelus il est vrai )  il m ' estt arrivé que ce fichier disparraisse . en plus de celle prévue dans le script .



PS :

geole a écrit :

La safe mécanique, elle risque de remplir  toute la partition HOME  qui est probablement intégrée au logiciel  avec tout le risque qui en découle pour le redémarrage. Je n'aime pas l'idée de faire croire que tout va bien alors que tout est vau-l'eau. Tant pis si je suis le seul à penser cela.

j ' ai modifié le script d' origine pour prendre en compte ta remarque au niveau du fstab wink



ET merci à tous ceux qui ont participé et aider à construire ce script .
C ' est vraiment formidable de trouver autant d' aide sur ce forum !

Dernière modification par iznobe (Le 12/10/2025, à 17:56)

Hors ligne

#372 Le 12/10/2025, à 18:28

geole

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

Bonjour
Je pars du principe que c'est toujours cette consigne qui est valable.
sudo su -c "bash <(wget -qO- https://raw.githubusercontent.com/iznobe/automount_part_data/refs/heads/main/automount_part_data.sh)"

J'ai eu (très) peur.....

  n°  ⇒    path     fstype  externe/interne     mountpoint     label
-----------------------------------------------------------------------------
  1   ⇒ /dev/sda1    ntfs          0                          ssdWinboot
  2   ⇒ /dev/sda2    ntfs          0                          ssdWinXP
  3   ⇒ /dev/sda3    ntfs          0                          ssdWin10
  4   ⇒ /dev/sdb1    ntfs          0                          WinXP-2To
  5   ⇒ /dev/sdb2    ntfs          0       /media/NosDonnees      NosDonnees
  6   ⇒ /dev/sdb3    ntfs          0                          Win7-2To
  7   ⇒ /dev/sdc2    ntfs          0                          4ToWinXP-2To
  8   ⇒ /dev/sdc3    ntfs          0                          4ToWin7-2To
  9   ⇒ /dev/sdc4    ntfs          0                          4tossdWinboot
  10  ⇒ /dev/sdc5    ext4          0                          4ToHOME
  11  ⇒ /dev/sdc6    ntfs          0                          4ToNosDonnees
  12  ⇒ /dev/sdc7    ntfs          0       /media/4ToBigDisk      4ToBigDisk
  13  ⇒ /dev/sdc8    ntfs          0       /media/4ToReserve      4ToReserve
  14  ⇒ /dev/sdc9    ntfs          0                          4TossdWin10
  15  ⇒ /dev/sdc11    ext4          0                          4ToFamille
  16  ⇒ /dev/sdc12    ntfs          0                          4tossdWin10-OLD
  17  ⇒ /dev/sdc13    ext4          0                          4TossdUbuntu2404
  18  ⇒ /dev/sdd3    ntfs          0                          
  19  ⇒ /dev/sdd4    ext4          0                          
  20  ⇒ /dev/md0    ext4          0                          
  21  ⇒ /dev/md0    ext4          0                          

Choisissez le numéro correspondant à votre future partition de données : 19
La partition « /dev/sdd4 » n’a pas d’étiquette.
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 : iznobe
Voulez-vous procéder au montage maintenant pour la partition « /dev/sdd4 » en y mettant pour étiquette « iznobe » ? [O/n] 
Etes-vous SÛR de vouloir procéder au montage pour la partition « /dev/sdd4 » en y mettant pour étiquette « iznobe » ? [O/n] 
sauvegarde du fichier « /etc/fstab » en « /etc/fstab.BaK » avant modifications
rmdir: suppression du répertoire, '/media/NosDonnees'
rmdir: impossible de supprimer '/media/NosDonnees': Périphérique ou ressource occupé
rmdir: suppression du répertoire, '/media/4ToBigDisk'
rmdir: impossible de supprimer '/media/4ToBigDisk': Périphérique ou ressource occupé
rmdir: suppression du répertoire, '/media/4ToReserve'
rmdir: impossible de supprimer '/media/4ToReserve': Périphérique ou ressource occupé
rmdir: suppression du répertoire, '/media/NTFS'
mkdir: création du répertoire '/media/iznobe'
mkdir: création du répertoire '/media/iznobe/a-iznobe'
appartenance de '/media/iznobe/a-iznobe' modifiée de root:root en a:a
mkdir: création du répertoire '/media/iznobe/.Trash-1000'
appartenance de '/media/iznobe/.Trash-1000' modifiée de root:root en a:a
le mode de '/media/iznobe/.Trash-1000' a été modifié de 0755 (rwxr-xr-x) en 0700 (rwx------)

Création de la corbeille réussie
-----------------------------------------------------------------
 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/iznobe/a-iznobe » .

Dernière modification par geole (Le 12/10/2025, à 18:32)


Les écrans de l'installateur 26.04 https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity

Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248

Hors ligne

#373 Le 12/10/2025, à 18:40

geole

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

J'ai fais un copier/coller du contenu de l'échange 371
C'est en train de tourner
Dans mon $HOME, il y avait un lien symbolique, c'est en train  aussi de  de placer son contenu.     

Je ne mets que la fin

répertoire '/home/a/ventoy-1.1.07/WebUI/static/js' supprimé
répertoire '/home/a/ventoy-1.1.07/WebUI/static' supprimé
'/home/a/ventoy-1.1.07/WebUI/index.html' supprimé
'/home/a/ventoy-1.1.07/WebUI/favicon.ico' supprimé
répertoire '/home/a/ventoy-1.1.07/WebUI' supprimé
'/home/a/ventoy-1.1.07/CreatePersistentImg.sh' supprimé
'/home/a/ventoy-1.1.07/VentoyVlnk.sh' supprimé
répertoire '/home/a/ventoy-1.1.07' supprimé
copié '/home/a/ventoy.txt' -> '/media/iznobe/a-iznobe/ventoy.txt'
'/home/a/ventoy.txt' supprimé
 Script pour montage de partition de données terminé avec succès ! 
root@b:~# 
a@b:~$ grep -v "#" .config/*.dirs
XDG_DESKTOP_DIR="/media/NosDonnees/Bureau"
XDG_DOWNLOAD_DIR="/media/NosDonnees/Téléchargements"
XDG_TEMPLATES_DIR="$HOME/Modèles"
XDG_PUBLICSHARE_DIR="$HOME/Public"
XDG_DOCUMENTS_DIR="$HOME/Documents"
XDG_MUSIC_DIR="$HOME/Musique"
XDG_PICTURES_DIR="$HOME/Images"
XDG_VIDEOS_DIR="$HOME/Vidéos"
XDG_DIVERS_DIR="$HOME/Divers"
a@b:~$ ls -l
total 0
lrwxrwxrwx 1 root root 35 oct.  12 18:34  4755 -> /media/iznobe/a-iznobe//home/a/4755
lrwxrwxrwx 1 root root 40 oct.  12 18:35  ancestris -> /media/iznobe/a-iznobe//home/a/ancestris
lrwxrwxrwx 1 root root 34 oct.  12 18:35  bin -> /media/iznobe/a-iznobe//home/a/bin
lrwxrwxrwx 1 root root 36 oct.  12 18:35  build -> /media/iznobe/a-iznobe//home/a/build
lrwxrwxrwx 1 root root 37 oct.  12 18:34  Bureau -> /media/iznobe/a-iznobe//home/a/Bureau
lrwxrwxrwx 1 root root 39 oct.  12 18:34  DDrescue -> /media/iznobe/a-iznobe//home/a/DDrescue
lrwxrwxrwx 1 root root 37 oct.  12 18:34  Divers -> /media/iznobe/a-iznobe//home/a/Divers
lrwxrwxrwx 1 root root 40 oct.  12 18:34  Documents -> /media/iznobe/a-iznobe//home/a/Documents
lrwxrwxrwx 1 root root 37 oct.  12 18:35  Images -> /media/iznobe/a-iznobe//home/a/Images
lrwxrwxrwx 1 root root 58 oct.  12 18:34 ' Mes donnees synchronisées' -> '/media/iznobe/a-iznobe//home/a/ Mes donnees synchronisées'
lrwxrwxrwx 1 root root 39 oct.  12 18:35  Modèles -> /media/iznobe/a-iznobe//home/a/Modèles
lrwxrwxrwx 1 root root 38 oct.  12 18:35  Musique -> /media/iznobe/a-iznobe//home/a/Musique
lrwxrwxrwx 1 root root 57 oct.  12 18:35  net.zombietrackergps.ztgps -> /media/iznobe/a-iznobe//home/a/net.zombietrackergps.ztgps
lrwxrwxrwx 1 root root 45 oct.  12 18:35  pastebincl-1.0 -> /media/iznobe/a-iznobe//home/a/pastebincl-1.0
lrwxrwxrwx 1 root root 37 oct.  12 18:35  Photos -> /media/iznobe/a-iznobe//home/a/Photos
lrwxrwxrwx 1 root root 37 oct.  12 18:35  Public -> /media/iznobe/a-iznobe//home/a/Public
lrwxrwxrwx 1 root root 36 oct.  12 18:35  RECUP -> /media/iznobe/a-iznobe//home/a/RECUP
lrwxrwxrwx 1 root root 34 oct.  12 18:35  SDC -> /media/iznobe/a-iznobe//home/a/SDC
lrwxrwxrwx 1 root root 35 oct.  12 18:37  snap -> /media/iznobe/a-iznobe//home/a/snap
lrwxrwxrwx 1 root root 48 oct.  12 18:35  Téléchargements -> /media/iznobe/a-iznobe//home/a/Téléchargements
lrwxrwxrwx 1 root root 46 oct.  12 18:37  thunderbird.tmp -> /media/iznobe/a-iznobe//home/a/thunderbird.tmp
lrwxrwxrwx 1 root root 44 oct.  12 18:37  ventoy-1.1.07 -> /media/iznobe/a-iznobe//home/a/ventoy-1.1.07
lrwxrwxrwx 1 root root 38 oct.  12 18:35  Vidéos -> /media/iznobe/a-iznobe//home/a/Vidéos
lrwxrwxrwx 1 root root 36 oct.  12 18:35  Wiper -> /media/iznobe/a-iznobe//home/a/Wiper

Tous les liens symboliques sont foirés et  donc en rouge.

 ls -l /media/iznobe/a-iznobe
total 18628
drwsr-x--x  2 a    a           4096 nov.   6  2024  4755
drwxr-x--x  7 a    a           4096 mars  17  2025  ancestris
-rwxr-x--x  1 a    a         269366 déc.  18  2024  a.txt
-rwxr-x--x  1 a    a          20610 sept. 19  2024  BadDisk.txt
-rwxr-x--x  1 a    a        1062579 déc.  19  2024  Big.txt
drwxr-x--x  2 a    a           4096 avril 28 19:25  bin
-rwxr-x--x  1 a    a            615 nov.   5  2024  Blame.txt
-rwxr-x--x  1 a    a          62403 nov.   6  2024  bootinfo.txt
-rwxr-x--x  1 a    a            182 oct.   6  2024  boot-repair.txt
-rwxr-x--x  1 a    a           4991 août  15 10:00  brprinter_install.log
-rwxr-x--x  1 a    a          21086 août  15 09:53  brprinter_install.sh
-rwxr-x--x  1 a    a         156622 oct.  21  2024  Bug.txt
drwxr-x--x  2 a    a           4096 juil. 19 12:52  build
lrwxrwxrwx  1 a    a             24 sept. 18  2024  Bureau -> /media/NosDonnees/Bureau
-rwxr-x--x  1 a    a            103 oct.   7 16:19  DATE
drwxr-x--x  7 a    a           4096 nov.  17  2024  DDrescue
-rwxr-x--x  1 a    a              0 nov.   4  2024  Démarrage1.txt
-rwxr-x--x  1 a    a         240685 nov.  13  2024  Démarrage2.txt
-rwxr-x--x  1 a    a         183462 nov.   4  2024  Démarrage3.txt
-rwxr-x--x  1 a    a          14707 nov.   4  2024  DémarrageX.txt
drwxr-x--x  2 a    a           4096 mars   5  2025  Divers
drwxr-x--x  3 a    a           4096 oct.  12 11:24  Documents
-rwxr-x--x  1 a    a           1812 oct.   7 16:26  DupliNosDonnees.sh
-rw-rw-r--  1 a    a           4834 oct.   2 16:59  DupliUbuntu.sh
-rwxrwxr-x  1 a    a            466 sept. 17 15:16  DupliWindows10.sh
-rwxr-x--x  1 a    a           4107 avril 27 18:28  err
-rw-r--r--  1 root root           0 oct.   7 16:26  ERR
-rw-rw-r--  1 a    a             38 sept.  2 14:49  essai
-rwxr-x--x  1 a    a              6 avril  3  2025  Essai
-rw-rw-r--  1 a    a            278 oct.   6 18:59  F-err.txt
-rwxr-x--x  1 a    a              5 oct.  20  2024  fic
-rwxr-x--x  1 a    a             12 août  19 15:34  FICFVIR
-rwxr-x--x  1 a    a              0 mars  25  2025  flatpak-builder.txt
-rw-rw-r--  1 a    a              0 oct.   6 20:10  F.txt
-rwxr-x--x  1 a    a           6932 mars  18  2025  gparted_details.htm
drwxr-x--x  3 a    a           4096 mai   12 11:59  Images
-rwxr-x--x  1 a    a           1639 mai   26 13:21  ipv6.txt
-rwxr-x--x  1 a    a        1273588 mars  31  2025  journal
-rwxr-x--x  1 a    a         312941 nov.   4  2024  journal.txt
-rwxr-x--x  1 a    a           2798 janv.  6  2025  lightdm1.txt
-rwxr-x--x  1 a    a          32133 janv.  6  2025  lightdm.txt
-rwxr-x--x  1 a    a             95 mai   11 19:20  LIRE-sdc
-rwxr-x--x  1 a    a              0 mai   11 19:20  LIRE-sdc.1.txt
-rwxr-x--x  1 a    a              0 mai   11 19:20  LIRE-sdc.2.txt
-rwxr-x--x  1 a    a           3647 avril 12  2025  lsblk
drwxr-x--x  3 a    a           4096 mai   27 16:11 ' Mes donnees synchronisées'
drwxr-x--x  2 a    a           4096 nov.   3  2024  Modèles
-rwxr-x--x  1 a    a         104772 avril 13 19:06  mount
drwxr-x--x  2 a    a           4096 nov.   3  2024  Musique
drwxr-x--x  7 a    a           4096 mars  26  2025  net.zombietrackergps.ztgps
-rwxr-x--x  1 a    a             32 déc.  11  2024  open
drwxr-x--x  3 a    a           4096 janv.  8  2012  pastebincl-1.0
-rwxr-x--x  1 a    a           5908 avril 25 15:27  Persistance.REF.txt
-rwxr-x--x  1 a    a           9142 mai   10 12:39  Persistance.sh
-rwxr-x--x  1 a    a          11849 juin   7 19:30  Persistance.txt
drwxr-x--x  2 a    a           4096 juin  14 18:23  Photos
-rwxr-x--x  1 a    a          24201 juil. 19 19:26  psmem.sh
drwxr-x--x  2 a    a           4096 nov.   3  2024  Public
-rwxr-x--x  1 a    a         181316 juin   5 16:20  Rapport.html
-rwxr-x--x  1 a    a          14570 juin   5 15:40  rapport_v1.2.sh
drwxr-x--x  2 a    a           4096 mars  26  2025  RECUP
-rwxr-x--x  1 a    a           5454 nov.   5  2024  reparer.sh
-rwxr-x--x  1 a    a           2605 mars  30  2025  RwRw.OLD.txt
-rwxr-x--x  1 a    a           3208 avril  3  2025  RwRw.txt
-rwxr-x--x  1 a    a            345 nov.  13  2024  sda.rescue
-rwxr-x--x  1 a    a            411 nov.  13  2024  sda.rescue.bak
-rwxr-x--x  1 a    a              0 avril 12  2025  sdb.badblocs
-rwxr-x--x  1 a    a            347 avril 12  2025  sdb.rescue
-rwxr-x--x  1 a    a            414 nov.  13  2024  sdb.rescue.bak
drwxr-x--x  2 a    a           4096 nov.  13  2024  SDC
-rwxr-x--x  1 a    a            347 nov.  14  2024  sdc.rescue
-rwxr-x--x  1 a    a            414 nov.  14  2024  sdc.rescue.bak
-rwxr-x--x  1 a    a              4 sept. 20  2024  sdd.reprise
-rwxr-x--x  1 a    a            344 nov.  13  2024  sdd.rescue
-rwxr-x--x  1 a    a            409 nov.  13  2024  sdd.rescue.bak
-rwxr-x--x  1 a    a            587 sept. 20  2024  sdd.vitesse
-rwxr-x--x  1 a    a            344 nov.  14  2024  sde.rescue
-rwxr-x--x  1 a    a            410 nov.  14  2024  sde.rescue.bak
-rwxr-x--x  1 a    a            193 janv. 17  2025  sedzUv5yi
drwx------ 13 a    a           4096 juin   5 18:22  snap
-rwxr-x--x  1 a    a            445 déc.  29  2024  snap.txt
-rwxr-x--x  1 a    a          10180 déc.  12  2024  SSH.txt
-rwxr-x--x  1 a    a           9036 déc.   4  2024  SSH.txt.save
-rwxr-x--x  1 a    a            713 mars  31  2025  sudo
-rwxr-x--x  1 a    a             70 juil. 31 16:05 'sudo su.txt'
-rwxr-x--x  1 a    a            390 janv. 27  2025  Suivi
-rwxrwxr-x  1 a    a          12037 oct.  12 18:33  T
-rwxr-x--x  1 a    a            713 mars  31  2025  tee
lrwxrwxrwx  1 a    a             35 août  18 18:12  Téléchargements -> /media/NosDonnees/Téléchargements
-rwxr-x--x  1 a    a             42 mars  29  2025  temps
-rwxr-x--x  1 a    a          15437 juil. 27 18:56  test
-rwxr-x--x  1 a    a          12978 avril 13 19:03  TestDébit.txt
-rwxr-x--x  1 a    a           6133 sept. 20 13:44  testdisk.log
-rwxr-x--x  1 a    a           3614 nov.   4  2024  test.txt
-rwxr-x--x  1 a    a          20022 mars  19  2025  TestZFS.txt
-rwxr-x--x  1 a    a          23957 juin   5 17:07  T.html
drwxr-x--x  2 a    a           4096 nov.   5  2024  thunderbird.tmp
-rwxr-x--x  1 a    a          47657 janv. 25  2025  top.txt
-rwxr-x--x  1 a    a           8138 janv. 25  2025  trace.txt
-rwxr-x--x  1 a    a            417 mai   12 11:13  Tri1.txt
-rwxr-x--x  1 a    a           1236 mai   12 16:57  Tri.sh
-rwxr-x--x  1 a    a            416 mai   12 11:15  Tri.txt
-rwxr-x--x  1 a    a       14538582 juil. 18 09:23  ubuntu.zsync
-rwxr-x--x  1 a    a            844 mars  12  2025  udev.txt
drwxr-xr-x  7 a    a           4096 août  28 17:20  ventoy-1.1.07
-rwxrw-rw-  1 a    a          10528 juil. 19 19:26  ventoy.txt
drwxr-x--x  2 a    enfants     4096 août  20 09:30  Vidéos
drwxr-x--x  2 a    a           4096 avril 23 16:11  Wiper
-rwxr-x--x  1 a    a            561 janv.  6  2025  ZFS.txt

Je ne vais pas pouvoir pointer en détail. Il est maintenant l'heure d'allumer le barbecue.

Dernière modification par geole (Le 12/10/2025, à 18:50)


Les écrans de l'installateur 26.04 https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity

Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248

Hors ligne

#374 Le 12/10/2025, à 18:45

iznobe

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

@geole , merci de vouloir tester , mais non , le nouveau script a testé n' est pas dans le github .
il faut le prendre manuellement , c' est celui du #371 pour le moment .


Je suis étonné du retour que tu as eu avec le script du github ...



Pour le nouveau script , oui ca fait toujours un peu peur quand on voit qu ' il supprime plein de trucs tongue
c' est l' option " -v " de mv .
quand il a copié sur la nouvelle partition , il supprime les fichiers d ' origine .

Si tu as une idée pour montrer l' avancement de la progression , sans faire peur , je prends wink

Dernière modification par iznobe (Le 12/10/2025, à 18:50)

Hors ligne

#375 Le 12/10/2025, à 20:52

geole

Re : [ SCRIPT ] pour montage automatique partitions data , 3eme partie .

As-tu remarqué que je disais que les liens symboliques sont ratés.
D’autre part, comme tu avais beaucoup investi dans le fichier .config/*.dirs, je m’attendais à ce qu’il traite uniquement les répertoires qu’il contient,


Les écrans de l'installateur 26.04 https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity

Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248

Hors ligne