Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 通过在文件夹中搜索特定文件夹名称来压缩用户文件的脚本_Bash_Shell_Loops_Scripting - Fatal编程技术网

Bash 通过在文件夹中搜索特定文件夹名称来压缩用户文件的脚本

Bash 通过在文件夹中搜索特定文件夹名称来压缩用户文件的脚本,bash,shell,loops,scripting,Bash,Shell,Loops,Scripting,我正在为我的一个程序编写一个函数,该程序需要搜索多个文件夹,直到找到一个名为“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

我正在为我的一个程序编写一个函数,该程序需要搜索多个文件夹,直到找到一个名为“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*


}

我会把猫的无用用途保留下来

 NAME=$(sed -e "s/ //g" $USER_HOME/server.txt)
您似乎从未在函数中使用过
$USERS
$IDS

此代码:

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

此脚本中有几项内容不起作用,我不确定是否都找到了:

  • 是否确实要检查所有目录,这些目录正好低于
    /var/www/home/user/area/
    ?我希望有更严格的限制(即,仅在带有特定名称的子目录中)或更宽松的限制(即,所有目录最多低于
    /var/www/home/user/area/
    )3级)

  • for
    循环使用变量
    i
    ,但是
    i
    在循环体的任何地方都不使用。那不行

  • 如果[!-d“userfiles”]始终在相同(即当前)目录中执行测试
    。那也不行

  • 我不理解
    if[!-d“userfiles”]
    中的否定

  • tar
    的参数是
    $USERS
    。我希望类似于
    “$I/userfiles”


  • 假设
    sed
    命令仅用于删除前导或尾随空格,
    NAME=($(<$USER\u HOME/server.txt))
    是一种稍微复杂的方法,可以在不产生外部进程的情况下实现同样的效果。感谢cat提示-我已经对脚本的其余部分进行了解散,这是我以前没有做过的。感谢我将对此进行一次分析。感谢它的工作-$id不会被放入文件名中,只有最后一个dir被添加到zip中。作为一种解决方法,我删除了$id并将tar添加到'r'以附加tar