NF <= 2のファイルのAWK戻りパス

NF <= 2のファイルのAWK戻りパス

私はかなり近いと思いますが、何か愚かなものを見逃しています。awk拡張属性が存在しないか、属性値が欠落しているファイルのファイル名を印刷しようとしています。

したがって、ファイルは次のようになります。

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

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

awkuser.test2つの条件が満たされるかuser.testnullの場合は、ファイル名を返す必要があります""。これを行う確実な方法は簡単に確認するようですNFNF2以下の場合、そのうちの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ディストリビューションでは、ユーティリティ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" {} +

関連情報