如何在 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}'

实际上,正确的解决方案是 find w/ -nogroup 正如 Paul H 所建议的那样。

相关内容