在shell脚本中删除带有case语句的文件

时间:2015-04-15 11:54:15

标签: 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" ]
        then
          rm -rf "$rmdir"
        elif [ -f "$rmdir" ]
        then
          rm -f "$rmdir"
        fi
        ;;
    esac
  done

但是在执行脚本之后,我可以看到我不想删除的文件(/home/user/testscrpt/testlogfile.txt)也被删除了。 如果我在这里的脚本中有任何错误,请纠正我。

2 个答案:

答案 0 :(得分:1)

$rmdir的值不是绝对路径;它只包含基本名称testlogfile.txt

你首先需要chdir到目录:你不想开始递归删除错误的文件(我从这里的经验说)

#! /bin/ksh

cd /home/user/testscrpt
logFile=testlogfile.txt

for rmdir in *;  do
    case "$rmdir" in
        rndp|"$logFile"|rndp1)
            echo "keeping $rmdir"
            continue
            ;;
        *)
            echo "deleting $rmdir"
            rm -rf "$rmdir"
            ;;
    esac
done

答案 1 :(得分:0)

UNTESTED:

  pushd /home/user/testscript
  ls -d * | egrep -v '^(rndp1*|testlogfile.txt)$' | xargs rm -rf
  popd

你可能想要制作' ls ...'成功:

  

files_to_rm(){ls -d * | egrep -v' ^(rndp1 * | testlogfile.txt)$&#39 ;; }

所以它只是:

  pushd /... ; files_to_rm | xargs rm -fr ; popd

我觉得在采取行动之前有一种显示清单的方法很有用。 任何可以避免生命伤害的方式都可以减轻痛苦。