Bash 스크립트에서 ls 출력의 두 열을 캡처하는 방법

Bash 스크립트에서 ls 출력의 두 열을 캡처하는 방법

숫자 그룹이 포함된 디렉토리를 삭제하는 스크립트를 만들고 싶습니다.
지금까지 그룹을 캡처하고 분석했습니다.

#!/bin/bash
re='^[0-9]+$'
for x in `/usr/bin/ls -l /var/indexes | sort -k3,3 | tr -s " " | cut -f3 -d " "`
do
if [[ $x =~ $re ]] ; then
   echo "found one $x"
fi
done

문제는 디렉토리의 실제 이름이 다른 열에 있다는 것입니다.
다음은 ls 출력의 한 줄입니다.

drwxr-sr-x. 3                     3966 root 4096 Oct 20 16:29 dirname

따라서 ls 결과를 반복하고 그룹(이 경우 3966)과 디렉터리 이름(이 경우 dirname)을 캡처하여 빈 그룹이 발견되면 제거하는 rm -rf 명령을 구성할 수 있어야 합니다.
어떻게 해야 하나요?
미리 감사드립니다.

답변1

-nogroup 플래그와 함께 find를 사용하는 것이 더 쉽지 않습니까? 예를 들어:

find /var/indexes -nogroup

ls를 중심으로 스크립트를 작성하려면 awk가 열을 선택하는 데 사용하는 도구입니다.

답변2

Bash에서는 이 작업을 실제로 수행하고 싶지 않지만 요청했으므로 이렇게 분할할 수 있습니다.

#!/bin/bash
re='^[0-9]+$'
for x in `/usr/bin/ls -l --time-style=+'%s' /var/indexes | sort -k3,3 | awk '{print $3 $7}'`
do
read -A nm <<< "$x"
if [[ ${nm[0]} =~ $re ]] ; then
   echo "found one " ${nm[1]}
fi
done

다음과 같이 awk에서 더 쉽습니다.

/usr/bin/ls -l --time-style=+'%s' /var/indexes | sort -k3,3 | awk '($3 ~ /^[0-9]+$/){print $7}'

실제로 올바른 솔루션은 Paul H가 제안한 대로 find with -nogroup입니다.

관련 정보