0

「userfiles」というフォルダーが見つかるまで、いくつかのフォルダーを検索する必要がある私のプログラムの 1 つの関数を作成しています。次に、このフォルダーを tar して、見つかったフォルダーのファイル名を指定します。以下は次のとおりです。最善の方法にアプローチしますか?

compress(){
NAME=$(cat $USER_HOME/server.txt | sed -e "s/ //g")
USERS=/var/www/home/user/area/*/*/*/
IDS=${PWD##*/}

# Apache Logs
tar -zcvf logs-$NAME.tar.gz /var/log/apache2

# User Logs
 for i in $USERS; 
       do
               if [ ! -d "userfiles" ];
                       then
                               tar -zcvf userfiles-$NAME-"$IDS".tar.gz  $USERS
               fi
 done;

# Linux Logs
tar -zcvf linux-logs-$NAME.tar.gz /var/log/auth.log* /var/log/syslog* /var/log/kern.log* /var/log/mail.log*


}
4

3 に答える 3

1

このコード:

for i in $USERS; 
  do
    if [ ! -d "userfiles" ];
      then
        tar -zcvf userfiles-$NAME-"$IDS".tar.gz  $USERS
    fi
done;

あなたが説明したことをしません。代わりに、フォルダーが現在の作業ディレクトリに存在userfilesしない場合、すべてのユーザー フォルダーが複数回tar されます。

次のようなことを試してください:

for d in $USERS; do
  if [ -d "${d}userfiles" ]; then
    tar -zcvf "userfiles-$NAME-$IDS.tar.gz" "${d}userfiles"
  fi
done
于 2013-05-18T14:53:43.570 に答える
0

cat の無用な使用を避けるには

 NAME=$(sed -e "s/ //g" $USER_HOME/server.txt)

$USERS関数内でandを使用したことがないようにも見えます$IDS

于 2013-05-18T13:23:06.747 に答える
0

このスクリプトには機能しないものがいくつかありますが、すべてを見つけられたかどうかはわかりません。

  1. ちょうど3 レベル下のディレクトリをすべてチェックしますか? より制限的なもの (つまり、特定の名前を持つサブディレクトリ内のみ) またはより寛容なもの (つまり、最大で 3 レベル下のすべてのディレクトリ) のいずれかを期待します。/var/www/home/user/area//var/www/home/user/area/

  2. forループは変数iを使用していますが、iループ本体のどこにも使用されていません。それはうまくいきません。

  3. テストif [ ! -d "userfiles" ]は常に同じ (現在の) ディレクトリで実行されます。それもうまくいきません。

  4. の否定がわかりませんif [ ! -d "userfiles" ]

  5. の引数はtarです$USERS。のようなものを期待します"$i/userfiles"

于 2013-05-18T14:57:17.467 に答える