在shell脚本中使用case语句删除文件

在shell脚本中使用case语句删除文件,shell,ksh,Shell,Ksh,我已经编写了一个小的shell脚本来删除目录中除少数文件之外的所有文件 #! /bin/ksh logFile=/home/user/testscrpt/testlogfile.txt echo "$logFile" for rmdir in * do case "$rmdir" in 'rndp'|"$logFile"|'rndp1') continue ;; *) if [ -d "$rmdir"

我已经编写了一个小的shell脚本来删除目录中除少数文件之外的所有文件

#! /bin/ksh

logFile=/home/user/testscrpt/testlogfile.txt
echo "$logFile"
  for rmdir in *
  do

    case "$rmdir" in
      'rndp'|"$logFile"|'rndp1')
        continue
        ;;

      *)
        if [ -d "$rmdir" ]
        then
          rm -rf "$rmdir"
        elif [ -f "$rmdir" ]
        then
          rm -f "$rmdir"
        fi
        ;;
    esac
  done
但是在执行脚本之后,我可以看到我不想删除的文件(/home/user/testscrpt/testlogfile.txt)也被删除了。
如果我在这里的脚本中有任何错误,请更正。

$rmdir
的值将不是绝对路径;它将只包含basename
testlogfile.txt

您需要先chdir到目录:您不想开始递归地删除错误的文件(我是根据这里的经验说的)

未经测试:

  pushd /home/user/testscript
  ls -d * | egrep -v '^(rndp1*|testlogfile.txt)$' | xargs rm -rf
  popd
您可能希望将“ls…”变成一个函数:

文件_to_rm(){ls-d*| egrep-v'^(rndp1*| testlogfile.txt)$'}

所以很简单:

  pushd /... ; files_to_rm | xargs rm -fr ; popd
我发现在对列表进行操作之前,有一种显示列表的方法是很有用的。
我能避免生活中的任何痛苦的方法都能减轻痛苦。

你是说
中断
而不是
继续
?现在,即使当前文件与日志文件(testlogfile.txt)匹配并删除它,您的逻辑仍将继续。如果要排除模式,则需要给出
break
break,当我匹配上面列出的任何文件或目录时,这里将中断case语句。我使用了continue,因此如果匹配模式1中提到的任何文件/目录,它将跳过该文件并继续下一个文件。但是如果继续,基本上就是允许它匹配日志文件模式并删除它,不是吗?我刚刚用break测试了一下,它没有删除与您在
'rndp'|“$logFile”|'rndp1'
中的模式匹配的文件,或者您希望删除这些文件吗?除了这3个文件,删除所有文件。基本上,变量在这里没有被正确替换。这里的问题可能是
$rmdir
不是完整路径,因此永远不会匹配
$logfile
。glob将完成裸文件名(您知道这是因为
rndp
rndp1
case
匹配位。使用变量进行测试,但它不起作用。如果我们使用正确的文本(testlogfile.txt)它工作得很好。在我的例子中,我在运行时得到了值,因此无法将其硬编码为某个常量。测试不起作用。在案例模式中,ksh中的变量替换似乎存在一些问题。您运行的是什么版本的ksh?您的操作系统是什么?您链接的场景与您的不同:在链接的问题中,特殊字符r“|”是变量值的一部分,因此它失去了它的特殊意义。这里不是这样。ksh版本和OS$echo$ksh_版本JM 93t+2010-06-21$cat/etc/issue欢迎使用SUSE Linux Enterprise Server 10 SP4(x86_64)-内核\r(\l)。此处的语法不会对ksh93造成问题。错误必须在代码的逻辑中。
  pushd /... ; files_to_rm | xargs rm -fr ; popd