shell脚本文件搜索

时间:2017-06-13 11:19:01

标签: shell file-handling

我尝试去路径并删除以collectorlist*开头的文件,所以我编写了如下所示的shell脚本。但是-e选项总是提供未找到的输出。请建议我。

脚本

if [ -d "/abc" ] ; then
for c in `ls -1 "/abc/"`; do
  if [ -d "/abc/${c}" ] ; then
     if [ -d "/abc/${c}/dynatrace/agent/linux-x86-64/agent/conf/" ] ; then
        if [ -e "/bxp/${c}/dynatrace/agent/linux-x86-64/agent/conf/collectorlist* " ] && echo "Found" || echo "Not found" ; then
          `ls -ltr "sat.txt"` > /users/home/abc/test.txt
            fi
         fi
   fi
 done
fi

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题。

  1. 星号后面和结束双引号之前有一个尾随空格。
  2. 您在双引号内使用星号;在双引号内,像星号这样的通配符不会被评估,而是逐字记录。
  3. 您正在使用反引号和重定向。这将执行反引号内的东西,用它的输出替换反引号表达式并执行结果行。因此,您的ls命令需要提供一个命令的名称,然后执行该命令。我想你不想要那个。只需删除反引号,您可能只想执行ls并将其输出重定向到文件中。
  4. 您试图找出是否存在与模式匹配的任何文件,并使用[ -e pattern* ]进行此操作。 pattern*评估一个或多个文件名或(不存在)pattern*本身(除非您调整shell以表现不同)。问题是许多值的情况。这些会在您的[ ... ]表达式中出现问题。
  5. 结果:

    if [ -d "/abc" ] ; then
      for c in $(ls -1 "/abc/"); do
        if [ -d "/abc/${c}/dynatrace/agent/linux-x86-64/agent/conf/" ] ; then
          if ls "/bxp/${c}/dynatrace/agent/linux-x86-64/agent/conf"/collectorlist* &> /dev/null; then
            echo "Found"
            ls -ltr "sat.txt" > /users/home/abc/test.txt
          else
            echo "Not Found"
          fi
        fi
      done
    fi