用于 chattr 和 lsattr 的 Zenity GUI

Zenity GUI for chattr and lsattr

描述:

你好Stackers,我目前正在为命令chattr制作一个zenity GUI。我想做的是显示和更改文件的属性,使用 zenity --list --checklist 勾选我想要的属性, 但我面临的主要问题是我不知道 lsattr 输出的顺序是什么,比如: -------------e-- file

代码示例:

attr=("A" "Solo escritura" "a" "No actualizar" "c" "Comprimido" "C" "No copiar en escritura" "D" "Actualización de directorio sincrónica" "d" "Ignorar en backup" "E" "Error de compreción" "e" "Usando extents" "h" "Archivo enorme" "I" "Indexación hashed trees" "i" "Archivo inmutable" "j" "Registro de datos" "s" "Borrado seguro" "S" "Actualización sincrónica" "T" "Directorio tope" "t" "Archivo sin cola" "u" "Deshacer borrado" "X" "Acceso crudo dec compreción" "Z" "Archivo comprimido sucio" "-v" "Generar verción de archivo")

fileattr=$(lsattr "$file") ; j=0 ; k=1

for (( i=1; i<=15; i++ )); do
    [[ "${fileattr:$i:1}" != "-" ]] && values+="true ${attr[$j]} ${attr[$k]//' '/_} " && setted+="${attr[$j]} " ||\
    values+="false ${attr[$j]} ${attr[$k]//' '/_} "
    ((j+=2)) ; ((k+=2))
done

zenity --list --checklist --column="Estado" --column="Atributo" --column="Descripción" ${values}

代码解释:

  1. attr 是一个数组,使用 page
  2. 排序
  3. for 循环运行 15 次(等于 lsattr 返回的文件属性的数量),并且在每个循环中它验证未设置的属性“-”,如果一个属性设置然后将 "true attr[j] attr[k]" 追加到 values 并将属性追加到 setted(供以后使用)或将 "false attr[j] attr[k]" 追加到 values
  4. 最后用收集到的values调用zenity

启动输出:

Zenity window 它告诉我 "s" 属性已设置,但事实并非如此,因为 lsattr 输出是 -------------e-- file。我注意到 page 中的属性比 lsattr 输出中的属性多

注:

我知道,也许我没有使用正确的方法,所以如果你能找到更好的方法,我洗耳恭听。

谢谢。

关联数组将在此任务中发挥作用。

让我们定义一个包含所有可能属性的列表:

valueList=acdeijstuACDST

让我们定义一个关联数组来存储值:

declare -A valueMap

使用所有属性的所有 false 值初始化地图:

for ((i = 0; i < ${#valueList}; i++)); do
    name=${valueList:i:1}
    valueMap[$name]=false
done

遍历 fileattr 中的字符以将映射中的值更新为 true:

for ((i = 0; i < 16; i++)); do
    name=${fileattr:i:1}
    [[ $name != - ]] && valueMap[$name]=true
done

合并 valueMap 和您原来的 attr 以创建要传递给 Zenity 的值数组:

zenityValues=()
for ((i = 0; i < ${#attr[@]}; i+=2)); do
    name=${attr[i]}
    description=${attr[i+1]}
    zenityValues+=(${valueMap[name]} "$name" "$description")
done

最后像您一样调用 Zenity,但将 zenityValues 作为数组传递:

zenity ... "${zenityValues[@]}"