スクリプト

スクリプト

現在、私は完全な手作業をしています。

find /home/bash_cookbook/bash_cookbook/glassfish/domains/blog/logs -mtime +7 -type f -name 'application.log_*' -exec rm {} \;

移動したいディレクトリ名をすべて入力するのに1時間かかりました。

質問?

各サーバーには、異なるドメイン名を持つ20の異なるドメインを持つ100を超えるサーバーがあります。私が思いついた賢いアプローチは、特定のディレクトリをすべて含めるのではなく除外することです。その一部には、私が触れる必要がない「バックアップ」などの一部のドメインが含まれているためです。

しかし、私はそれを実装する方法を知りません。


私が考えることができるもう一つの素晴らしいトリックはこれです。

find /home/bash_cookbook/bash_cookbook/glassfish/domains/$domains_except_excluded_domains/logs -mtime +7 -type f -name 'application.log_*' -exec rm {} \;

これを行うには、除外するすべてのドメインを含める必要がある domains_ Except_excluded_domains 変数が必要です。これはどのように達成できますか?

ベストアンサー1

配列をサポートする別のシェルを使用している場合は、処理bashに含めるフィールドのセットを一覧表示できます。

#!/bin/bash
incDomains=('blog' 'news' 'webmail' …)

for domain in "${incDomains[@]}"
do
    echo "Considering $domain"
    find "/home/bash_cookbook/bash_cookbook/glassfish/domains/$domain/logs" -mtime +7 -type f -name 'application.log_*' -delete
done
echo "Done"

$domain変数がfindパスのどこに挿入されるべきかを推測しています。必要に応じて移動します。

次のようなものを使用できます入らないようにするドメイン(安全に列挙できると確信している場合)この方法は、除外するドメインのリストから始まり、クイックルックアップのためにそれを連想配列(ハッシュ)に変換し、ハッシュ内のすべてのディレクトリをスキップしてドメインディレクトリセットを繰り返します。

#!/bin/bash
excDomains=('blog' 'news' 'webmail' …)

declare -A excDomainsH
for domain in "${excDomains[@]}"; do excDomainsH[$domain]=1; done

for domainPath in "/home/bash_cookbook/bash_cookbook/glassfish/domains"/*
do
    domain="${domainPath##*/}"
    [[ "${excDomainsH[$domain]}" -eq 1 ]] && continue

    echo "Considering $domain"
    find "$domainPath/logs" -mtime +7 -type f -name 'application.log_*' -delete
done
echo "Done"

どちらの場合もおすすめ-delete-printコードが期待どおりに機能すると確信するまで。実装での使用を考慮してfindいない場合(終了注)-delete-exec rm -f {} ++

おすすめ記事