0

I am trying to make a functional script just using Partition Label, get that label, from the Label get the Device, and pass fsck -fy twice on each partition.

#!/usr/bin/env bash
# Filter partition by label : except "Inukaze", "LUBUNTU" & "72GB"
Etiqueta=($(ls -l /dev/disk/by-label | grep -v "Inukaze" | grep -v "LUBUNTU" | grep -v "72GB" | awk '{print $9}'))

# Set array list using the labels for get device
Particion=($(for i in "${Etiqueta[@]}" ; do blkid -L "$i" ; done))

# And the part i need help :
for ((i=0; i<${#Etiqueta[@]}; i++)); do echo -e "\nExaminando : ""${Etiqueta[i]} (${Particion[i]})" & fsck -fy ${Particion[@]} & fsck -fy ${Particion[@]} ; done

Output of ls -l /dev/disk/by-label | grep -v "Inukaze" | grep -v "LUBUNTU" | grep -v "72GB" | awk '{print $9}':

1SlackIni
Compartido
Slack32
Slack64
Tactinu1
Tactinu1-Inicio
Tactinu1-Slack32
Tactinu1-Slack64

Output of « for i in "${Etiqueta[@]}" ; do blkid -L "$i" ; done »

/dev/sda1
/dev/sdb1
/dev/sdb6
/dev/sdb5
/dev/sdc1
/dev/sdc2
/dev/sdc4
/dev/sdc3

Output of for ((i=0; i<${#Etiqueta[@]}; i++)); do echo -e "\nExaminando : ""${Etiqueta[i]} (${Particion[i]})" & fsck -fy ${Particion[@]} & fsck -fy ${Particion[@]} ; done:

Examinando : 1SlackIni (/dev/sda1)
[2] 5199
fsck from util-linux 2.27.1
fsck from util-linux 2.27.1
e2fsck 1.42.13 (17-May-2015)
e2fsck 1.42.13 (17-May-2015)
/dev/sda1 está en uso.
e2fsck: No se puede continuar, se finaliza.

Paso 1: Verificando nodos-i, bloques y tamaños
e2fsck 1.42.13 (17-May-2015)
e2fsck 1.42.13 (17-May-2015)
fsck.ext3: Device or resource busy mientras se intentaba abrir /dev/sdb1
¿Sistema de ficheros montado o abierto en exclusiva por otro programa?
Paso 2: Verificando la estructura de directorios
Paso 3: Revisando la conectividad de directorios
Paso 4: Revisando las cuentas de referencia
Paso 5: Revisando el resumen de información de grupos
1SlackIni: 977/65536 ficheros (24.8% no contiguos), 114672/262144 bloques
e2fsck 1.42.13 (17-May-2015)
e2fsck 1.42.13 (17-May-2015)
fsck.ext3: Device or resource busy mientras se intentaba abrir /dev/sdb6
¿Sistema de ficheros montado o abierto en exclusiva por otro programa?
e2fsck 1.42.13 (17-May-2015)
e2fsck 1.42.13 (17-May-2015)
/dev/sdb5 está en uso.
e2fsck: No se puede continuar, se finaliza.

e2fsck 1.42.13 (17-May-2015)
e2fsck 1.42.13 (17-May-2015)
/dev/sdc1 está en uso.
e2fsck: No se puede continuar, se finaliza.

Paso 1: Verificando nodos-i, bloques y tamaños
e2fsck 1.42.13 (17-May-2015)
e2fsck 1.42.13 (17-May-2015)
/dev/sdc2 está en uso.
e2fsck: No se puede continuar, se finaliza.

Paso 1: Verificando nodos-i, bloques y tamaños
Paso 2: Verificando la estructura de directorios
Paso 3: Revisando la conectividad de directorios
Paso 4: Revisando las cuentas de referencia
Paso 5: Revisando el resumen de información de grupos
e2fsck 1.42.13 (17-May-2015)
e2fsck 1.42.13 (17-May-2015)
/dev/sdc4 está en uso.
e2fsck: No se puede continuar, se finaliza.


e2fsck 1.42.13 (17-May-2015)
e2fsck 1.42.13 (17-May-2015)
/dev/sdc3 está en uso.
e2fsck: No se puede continuar, se finaliza.

Paso 1: Verificando nodos-i, bloques y tamaños
Paso 1: Verificando nodos-i, bloques y tamaños
Paso 1: Verificando nodos-i, bloques y tamaños
Paso 1: Verificando nodos-i, bloques y tamaños
Paso 2: Verificando la estructura de directorios
Paso 1: Verificando nodos-i, bloques y tamaños
Tactinu1-Inicio: 11/133824 ficheros (0.0% no contiguos), 9196/535296 bloques
Paso 3: Revisando la conectividad de directorios
Paso 4: Revisando las cuentas de referencia
Paso 5: Revisando el resumen de información de grupos
Tactinu1-Slack64: 1450/1966560 ficheros (49.7% no contiguos), 5377699/7865600 bloques
Paso 2: Verificando la estructura de directorios
Paso 3: Revisando la conectividad de directorios
Paso 4: Revisando las cuentas de referencia
Paso 5: Revisando el resumen de información de grupos
Tactinu1-Slack32: 27765/1966080 ficheros (10.0% no contiguos), 5993183/7863808 bloques
Paso 2: Verificando la estructura de directorios
Paso 3: Revisando la conectividad de directorios
Paso 4: Revisando las cuentas de referencia
Paso 5: Revisando el resumen de información de grupos
Tactinu1: 81725/5709824 ficheros (25.0% no contiguos), 20667299/22807552 bloques

Desire output : First the echo output "Examinando : $Etiqueta ($Particion)", after fsck normal output "Paso 1" :

Examinando : 1SlackIni (/dev/sda1) 
Paso 1: Verificando nodos-i, bloques y tamaños
Paso 2: Verificando la estructura de directorios
Paso 3: Revisando la conectividad de directorios
Paso 4: Revisando las cuentas de referencia
Paso 5: Revisando el resumen de información de grupos
1SlackIni: 977/65536 ficheros (24.8% no contiguos), 114672/262144 bloques

[ wait for the before fsck finish ]

Examinando : 1SlackIni (/dev/sda1) 
Paso 1: Verificando nodos-i, bloques y tamaños
Paso 2: Verificando la estructura de directorios
Paso 3: Revisando la conectividad de directorios
Paso 4: Revisando las cuentas de referencia
Paso 5: Revisando el resumen de información de grupos
1SlackIni: 977/65536 ficheros (24.8% no contiguos), 114672/262144 bloques

[ Yes twice, because i ever do this two times ]

Examinando Compartido (/dev/sdb1)
fsck from util-linux 2.27.1
e2fsck 1.42.13 (17-May-2015)
Paso 1: Verificando nodos-i, bloques y tamaños
Paso 2: Verificando la estructura de directorios
Paso 3: Revisando la conectividad de directorios
Paso 4: Revisando las cuentas de referencia
Paso 5: Revisando el resumen de información de grupos
Compartido: 1105544/39321600 ficheros (27.2% no contiguos), 149013032/157286400 bloques

The output is long.

0

1 Answer 1

1

To start with, never parse the output of ls - that can never work reliably, there are far too many things that can (will!) cause it to fail. Use find ... -print0 and mapfile to populate an array instead.

e.g.


# Get all symlinks in /dev/disk/by-label/ except those
# containing Inukaze or LUBUNTU in the name.  Use NUL
# as the filename separator so it will work with ANY
# filename, even those containing annoying characters like
# spaces or shell metacharacters.
mapfile -d '' -t Etiqueta < <(
    find /dev/disk/by-label/ -type l \
    ! -name '*Inukaze*' \
    ! -name '*LUBUNTU*' \
    -print0)

# now loop over those symlinks
for f in "${Etiqueta[@]}" ; do
  # label name without path
  label="${f/*\//}"

  # get the real path of the symlink
  rp="$(realpath "$f")"

  # skip those that aren't block devices
  [ -b "$rp" ] || continue

  # skip block devs with size 72GB. Strip leading and
  # trailing spaces from lsblk's output with sed.
  size=$(lsblk -n -o size "$rp" | sed -E -e 's/^ *| *$//g') 
  [ "$size" = "72G" ] && continue 

  # Now do whatever you need to with "$rp".
  # Remember to always double-quote your variable expansions.

  # Use printf rather than echo because echo is unreliable and
  # easily broken.
  printf "\nExaminando: %s (%s)\n" "$label" "$rp"

  if fsck -fy "$rp" ; then
     if ! fsck -fy "$rp" ; then
       printf "%s\n" "Error second fsck of $label ($rp) failed." >&2
     fi
  else
    printf "%s\n" "Error: first fsck of $label ($rp) failed." >&2
  fi
done

See also:

4
  • you probably want to skip swap partitions (and maybe other block dev types, e.g. zfs_member and maybe linux_raid_member) too. You can get the fstype of a block dev with fs=$(lsblk -n -o fstype "$f"). Commented Jul 26, 2022 at 5:29
  • Hi there, thanks for your answer, i don't know the existence of mapfile until you mention it. right now the mapfile version i am using, don't had the option "-d", what do that in your current distro ? in the link you put, neither have the "-d" option. if i delete "-d" the output result from mapfile is "mapfile: empty array variable name" Commented Jul 26, 2022 at 14:14
  • Well after some edits, is working, but what is best method from remove the output "Examinando: /dev/disk/by-label/Slack64 (/dev/sdb5)" the part "/dev/disk/by-label/" ? Commented Jul 26, 2022 at 14:52
  • 1
    1. mapfile is a bash built-in, not an external program. It doesn't have a version (or, if you want, it has the same version as whatever version of bash you're running). According to bash's changelog, mapfile has had a -d option since bash 4.4-alpha (late 2015). 2. To remove all but the last / from a string, you can use bash's parameter expansion features, e.g. var=/dev/disk/by-label/Slack64; echo ${var/*\//} will print just Slack64. See man bash and search for Parameter Expansion. Commented Jul 27, 2022 at 1:20

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.