启用bash extglob后无法从删除中排除单个文件

时间:2019-03-15 03:36:48

标签: bash shell

因此,过去几天来我一直在研究脚本,并遇到了这个可怕的问题!我正在尝试删除文件夹中除一个文件之外的所有内容。我已经使用shopt -s extglob在bash脚本中启用了“ extglob” shell选项,并且据我所知正确地设置了命令。这是我的问题的一个示例:

#!/bin/bash
drive=$1
outpath=/media/removable/$drive/test

shopt -s extglob
if [[ $2 = "Delete" ]];then
    rm -rvf $outpath/* !($outpath/save.tar)
# Also tried this:
#   rm -rvf !($outpath/save.tar) $outpath/*
      exit
fi

(不是我的实际文件,而是一个示例。)

我的目录设置为/,由于某种原因,它开始删除我的根目录中有权损坏的每个文件。我并不特别在意从中恢复,我的脚本根本无法正常工作,而且我无法将其排除在这个文件之外。我已经尝试了上面的示例,已经尝试了rm -rvf $outpath/* $outpath/!(save.tar),但似乎没有任何效果。有谁知道如何正确使用〜(“ path / to / file”)排除文件/路径?特别是在使用变量定义路径时?

1 个答案:

答案 0 :(得分:2)

假设save.tar位于test文件夹中,则无需使用单独的路径即可将文件排除在删除范围之外。除您在!()内提供的文件外,求反运算符已经使所有文件都遍历。

你可以做

rm -rvf "$outpath"/!(save.tar)

或者,如果您需要排除多个.tar个文件,则可以将否定符内的glob移动为!(*.tar),这意味着删除所有,但以{结尾的文件除外{1}}

下面是您问题的一个简单的可重现示例。在这里,命令.tar以外的所有文件删除并按预期工作。

file6

有关bash extended globbing的更多信息。