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.

muru
  • 72,889
Inukaze
  • 47

1 Answers1

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:

cas
  • 78,579
  • 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"). – cas Jul 26 '22 at 05: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" – Inukaze Jul 26 '22 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/" ? – Inukaze Jul 26 '22 at 14:52
  • 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.
  • – cas Jul 27 '22 at 01:20