数値グループを含むディレクトリを削除するスクリプトを作成したいと思います。
これまでグループを捕捉して分析した。
#!/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出力の1行です。
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です。