NF

NF

我想我已经很接近了,但我错过了一些愚蠢的事情。我正在尝试打印awk缺少扩展属性或缺少属性值的文件的文件名。

所以一个文件将会有类似的内容:

 getfattr -d /path/to/file/testfile.1

 # file: /path/to/file/testfile.1
 user.test="1"

awk如果满足两个条件,则应返回文件名; ifuser.test缺失,或者 ifuser.test为 null 即""。似乎执行此操作的明显方法是简单地检查NF.如果NF是 2 或更少,则意味着我们缺少其中一个,因此我们可以打印文件名。这是我到目前为止所拥有的:

readarray -t PATHS_ARRAY < <(find /files/to/audit type -f)

attr="user.test"

printf -- '%s\0' "${PATHS_ARRAY[@]} |\
xargs -0 getfattr -P --absolute-names --name="$attr" |\
awk -v attr_="${attr}=" '
  BEGIN { FS="[ ,\"]+" }
  $0 ~ ( attr_ ) {
    if ( NF <= 2 ) {
      print fname
      next
    }
  } { fname = $0 }
'

我们在 上进行分离",因此对于“正确”设置的扩展属性,我们应该得到

NF=
1           2 3
user.test=" 2 "

一个破碎的将会

NF=
1           2 (or 0 because user.test does not exist)         
user.test=" "

答案1

使用attr而不是getfattr检索属性。默认情况下,该实用程序将处理user命名空间中的属性。比较容易拉出来仅有的属性的值也是如此,因此不需要解析:

find /files/to/audit -type f -exec sh -c '
    for pathname do
        attrval=$( attr -q -g test "$pathname" 2>/dev/null )
        if [ -z "$attrval" ]; then
            printf "%s\n" "$pathname"
        fi
    done' sh {} +

或者,更短一些,

find /files/to/audit -type f -exec sh -c '
    for pathname do
        [ -z "$( attr -q -g test "$pathname" 2>/dev/null )" ] && printf "%s\n" "$pathname"
    done' sh {} +

这些代码片段将调用一个简短的内联脚本,其中包含从 in 或 under 找到的批量常规文件/files/to/audit。该sh -c脚本循环遍历当前找到的路径名集,尝试user.test从每个路径名获取属性。打印任何生成缺失或空属性值的路径名。

在基于 Debian 的 Linux 发行版上,getfattrattr实用程序分布在同一个包中(称为attr)。


稍微更花哨一些,具有参数化的属性名称和输出,将指示缺失或零长度的属性值:

attr=test

find /files/to/audit -type f -exec sh -c '
    attr=$1; shift
    for pathname do
        if attrval=$( attr -q -g "$attr" "$pathname" 2>/dev/null )
        then
            if [ -z "$attrval" ]; then
                printf "Empty: %s\n" "$pathname"
            fi
        else
            printf "Missing: %s\n" "$pathname"
        fi
    done' sh "$attr" {} +

或者,遵循干燥原则

attr=test

find /files/to/audit -type f -exec sh -c '
    attr=$1; shift
    for pathname do
        unset -v issue

        if attrval=$( attr -q -g "$attr" "$pathname" 2>/dev/null )
        then
            [ -z "$attrval" ] && issue=Empty
        else
            issue=Missing
        fi

        if [ -n "$issue" ]; then
            printf "%s: %s\n" "$issue" "$pathname"
        fi
    done' sh "$attr" {} +

相关内容