0

我正在为我的一个程序编写一个函数,该函数需要搜索多个文件夹,直到我们找到一个名为“userfiles”的文件夹,然后我们将这个文件夹压缩,给出它所在文件夹的文件名。下面是方法最好的方法?

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)

看起来您从未在函数中使用$USERSand 。$IDS

于 2013-05-18T13:23:06.747 回答
0

此脚本中有几处不起作用,我不确定是否全部找到:

  1. 您真的要检查所有正好低于 3 级的目录/var/www/home/user/area/吗?我希望更严格的东西(即仅在带有某些名称的子目录中)或更宽松的东西(即所有目录最多低于 3 级/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 回答