首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数组列表与bash中的结果进行比较

将数组列表与bash中的结果进行比较
EN

Stack Overflow用户
提问于 2013-05-30 18:37:24
回答 1查看 680关注 0票数 0

我正在编写一个脚本,它将从一个文件夹中获取用户列表,并将它们与/home/中的文件夹列表进行比较,并输出与服务器上的活动用户列表不匹配的任何文件夹。现在,我几乎把它放在我想要的地方,但是我很困惑如何在数组中获取我想要过滤的内容列表,将其与$COMPARE的输出进行比较,然后只输出与我想要过滤的内容不匹配的文件夹。

到目前为止,这是我的代码:

代码语言:javascript
复制
# Script for finding and displaying home folders that don't currently belong to an active user on the server
HOMEOUT=$(mktemp)
USEROUT=$(mktemp)
USERS=( $(find /var/cpanel/users/ -maxdepth 1 -type f -printf '%P\n' | sort >$USEROUT) )
HOME=( $(find /home* -maxdepth 1 -type d -printf '%P\n' | grep -v '^$' | sort >$HOMEOUT) )
FILTER=( 'mysql' 'migrate-sslrigs' 'rvadmin' 'cpeasyapache' 'lost+found' 'cpanelbranding' 'installd'
    'cprestore' 'cprubybuild' 'cprubygemsbuild' 'MySQL-install' 'mysql_upgrade' 'securervsite' 'virtfs' 'zabbix' )


# Compare the two files and only output folders from /home/ which don't match the active_users list
COMPARE=`comm -23 $HOMEOUT $USEROUT`

我在想“案例”可能是解决这个问题的方法,但我不知道这是否是最好的解决方法。如能提供任何指导/协助,将不胜感激。

更新

以下是当前代码:

代码语言:javascript
复制
HOMEOUT=$(mktemp)
USEROUT=$(mktemp)
USERS=( $(find /var/cpanel/users/ -maxdepth 1 -type f -printf '%P\n' | sort >$USEROUT) )
HOME=( $(find /home* -maxdepth 1 -type d -printf '%P\n' | grep -v '^$' | sort >$HOMEOUT) )
FILTER=( 'mysql' 'migrate-sslrigs' 'rvadmin' 'cpeasyapache' 'lost+found' 'cpanelbranding' 'installd'
        'cprestore' 'cprubybuild' 'cprubygemsbuild' 'MySQL-install' 'mysql_upgrade' 'securervsite' 'virtfs' 'zabbix' 'cpeasyapache'
        '.cpan' '.cpcpan' '.cpanm' )


# Compare the two files and only output folders from /home/ which don't match the active_users list
COMPARE=`comm -23 "$HOMEOUT" "$USEROUT" |
            comm -23 - <(
                for f in "${FILTER[@]}"; do
                    echo "$f"
                done)`

# Find the disk space of each folder
 pushd /home/ >/dev/null
for x in "$COMPARE"; do
        du -s $x | sort -n | cut -f 2-|xargs -i du -sh {}
done
  popd >/dev/null


# House cleaning
rm -f $HOMEOUT $USEROUT

当我使用bash -x运行脚本时,它会显示以下内容:

代码语言:javascript
复制
+ FILTER=('mysql' 'migrate-sslrigs' 'rvadmin' 'cpeasyapache' 'lost+found' 'cpanelbranding' 'installd' 'cprestore' 'cprubybuild' 'cprubygemsbuild' 'MySQL-install' 'mysql_upgrade' 'securervsite' 'virtfs' 'zabbix' 'cpeasyapache' '.cpan' '.cpcpan' '.cpanm')
++ comm -23 /tmp/tmp.fxYQB27380 /tmp/tmp.vwLWZ27381
++ comm -23 - /dev/fd/63
+++ for f in '"${FILTER[@]}"'
+++ echo mysql
+++ for f in '"${FILTER[@]}"'
+++ echo migrate-sslrigs
+++ for f in '"${FILTER[@]}"'
+++ echo rvadmin
+++ for f in '"${FILTER[@]}"'
+++ echo cpeasyapache
+++ for f in '"${FILTER[@]}"'
+++ echo lost+found
+++ for f in '"${FILTER[@]}"'
+++ echo cpanelbranding
+++ for f in '"${FILTER[@]}"'
+++ echo installd
+++ for f in '"${FILTER[@]}"'
+++ echo cprestore
+++ for f in '"${FILTER[@]}"'
+++ echo cprubybuild
+++ for f in '"${FILTER[@]}"'
+++ echo cprubygemsbuild
+++ for f in '"${FILTER[@]}"'
+++ echo MySQL-install
+++ for f in '"${FILTER[@]}"'
+++ echo mysql_upgrade
+++ for f in '"${FILTER[@]}"'
+++ echo securervsite
+++ for f in '"${FILTER[@]}"'
+++ echo virtfs
+++ for f in '"${FILTER[@]}"'
+++ echo zabbix
+++ for f in '"${FILTER[@]}"'
+++ echo cpeasyapache
+++ for f in '"${FILTER[@]}"'
+++ echo .cpan
+++ for f in '"${FILTER[@]}"'
+++ echo .cpcpan
+++ for f in '"${FILTER[@]}"'
+++ echo .cpanm

但是,输出仍然显示任何上述文件夹,这些文件夹应该被过滤掉。我觉得回声本身是不够的,而且可能缺少一些东西来从输出中删除任何与$FILTER匹配的内容。

有什么想法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-30 19:13:33

您可以将最后一行替换为:

代码语言:javascript
复制
COMPARE=`comm -23 "$HOMEOUT" "$USEROUT" |
            comm -23 - <(
                for f in "${FILTER[@]}"; do
                    echo "$f"
                done | sort)`

本部分:

代码语言:javascript
复制
<(for f in "${FILTER[@]}"; do
    echo "$f"
  done | sort)

用连接到<( )中脚本输出的管道读取端的文件名取代bash,后者打印FILTER数组的排序成员(每行一个)。

这个命令:

代码语言:javascript
复制
comm -23 - <(
    for f in "${FILTER[@]}"; do
        echo "$f"
    done | sort)`

输出输入中没有出现在FILTER数组中的行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16843563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档