我想我已经很接近了,但我错过了一些愚蠢的事情。我正在尝试打印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 发行版上,getfattr
和attr
实用程序分布在同一个包中(称为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" {} +