NF <= 2인 파일의 AWK 반환 경로

NF <= 2인 파일의 AWK 반환 경로

나는 꽤 가깝다고 생각하지만 뭔가 어리석은 것을 놓치고 있습니다. awk확장 속성이 없거나 속성 값이 누락된 파일의 파일 이름을 인쇄하려고 합니다 .

따라서 파일은 다음과 같습니다.

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

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

awkuser.test두 가지 조건이 충족되거나 user.testnull인 경우 파일 이름이 반환되어야 합니다 "". 이를 수행하는 확실한 방법은 간단히 확인하는 것 같습니다 NF. NF2 이하이면 그 중 하나가 누락되었음을 의미하므로 파일 이름을 인쇄할 수 있습니다. 이것이 내가 지금까지 가지고 있는 것입니다:

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).


매개변수화된 속성 이름과 누락되거나 길이가 0인 속성 값을 나타내는 출력을 사용하여 약간 더 멋집니다.

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" {} +

관련 정보