나는 꽤 가깝다고 생각하지만 뭔가 어리석은 것을 놓치고 있습니다. awk
확장 속성이 없거나 속성 값이 누락된 파일의 파일 이름을 인쇄하려고 합니다 .
따라서 파일은 다음과 같습니다.
getfattr -d /path/to/file/testfile.1
# file: /path/to/file/testfile.1
user.test="1"
awk
user.test
두 가지 조건이 충족되거나 user.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 {} +
이러한 코드 조각은 에서 또는 그 아래에 있는 일반 파일 배치를 포함하는 짧은 인라인 스크립트를 호출합니다 /files/to/audit
. 스크립트 sh -c
는 현재 발견된 경로 이름 세트를 반복하면서 user.test
각 경로 이름에서 속성을 가져오려고 합니다. 누락되거나 빈 속성 값을 생성하는 경로 이름을 인쇄합니다.
Debian 기반 Linux 배포판에서는 유틸리티 getfattr
와 attr
유틸리티가 동일한 패키지(라고 함)로 배포됩니다.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" {} +