私はかなり近いと思いますが、何か愚かなものを見逃しています。awk
拡張属性が存在しないか、属性値が欠落しているファイルのファイル名を印刷しようとしています。
したがって、ファイルは次のようになります。
getfattr -d /path/to/file/testfile.1
# file: /path/to/file/testfile.1
user.test="1"
awk
user.test
2つの条件が満たされるかuser.test
nullの場合は、ファイル名を返す必要があります""
。これを行う確実な方法は簡単に確認するようですNF
。NF
2以下の場合、そのうちの1つが欠落していることを意味するため、ファイル名を印刷できます。これが私が今まで持っているものです:
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 {} +
これらのコードスニペットは、内または下にある一般的なファイルの配置を含む短いインラインスクリプトを呼び出します/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" {} +