0

フォルダーからユーザーのリストを取得し、それらを /home/ 内のフォルダーのリストと比較し、サーバー上のアクティブなユーザーのリストと一致しないフォルダーを出力するスクリプトを作成しています。現在、私はそれを必要な場所にほとんど持っていますが、フィルターで除外したいもののリストを配列で取得し、それを $COMPARE の出力と比較して、そのフォルダーのみを出力する方法に困惑しています除外しようとしているものと一致しません。

これまでの私のコードは次のとおりです。

# 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`

「ケース」がここに行く方法かもしれないと考えていましたが、それを理解するのに問題があり、それがこれを処理する最善の方法であるかどうかはわかりません. ガイダンス/支援をいただければ幸いです。

更新しました

現在のコードは次のとおりです。

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 でスクリプトを実行すると、次のように表示されます。

+ 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 に一致するものを実際に削除するには、おそらく何かが欠けているように感じます。

考え?

4

1 に答える 1

2

最後の行を次のように置き換えることができます。

COMPARE=`comm -23 "$HOMEOUT" "$USEROUT" |
            comm -23 - <(
                for f in "${FILTER[@]}"; do
                    echo "$f"
                done | sort)`

この部分:

<(for f in "${FILTER[@]}"; do
    echo "$f"
  done | sort)

は、 bash 内のスクリプトの出力に接続されたパイプの読み取り側のファイル名に置き換えられます<( )。後者は、FILTER配列の並べ替えられたメンバーを 1 行に 1 つずつ出力します。

このコマンド:

comm -23 - <(
    for f in "${FILTER[@]}"; do
        echo "$f"
    done | sort)`

FILTER配列に表示されない入力からの行を出力します。

于 2013-05-30T19:13:33.527 に答える