![Bash 스크립트에서 ls 출력의 두 열을 캡처하는 방법](https://linux55.com/image/34423/Bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20ls%20%EC%B6%9C%EB%A0%A5%EC%9D%98%20%EB%91%90%20%EC%97%B4%EC%9D%84%20%EC%BA%A1%EC%B2%98%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
숫자 그룹이 포함된 디렉토리를 삭제하는 스크립트를 만들고 싶습니다.
지금까지 그룹을 캡처하고 분석했습니다.
#!/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입니다.