如何使用 echo 和 fsck 组合输出值

如何使用 echo 和 fsck 组合输出值

我正在尝试仅使用分区标签制作一个功能脚本,获取该标签,从标签获取设备,并fsck -fy在每个分区上传递两次。

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

输出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

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

输出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

期望输出:首先 echo 输出“Examinando : $Etiqueta ($Particion)”,在 fsck 正常输出“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

[等待 fsck 完成之前]

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

[是的两次,因为我曾经这样做过两次]

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

输出很长。

答案1

首先,绝不解析 - 的输出ls永远无法可靠地工作,有太多的事情可能(将会!)导致它失败。使用find ... -print0mapfile来填充数组。

例如


# 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

也可以看看:

相关内容