如何删除文件夹中除 grep 项目之外的所有项目

如何删除文件夹中除 grep 项目之外的所有项目

我想为用于备份的目录创建一个清理脚本。

例如:我的目录中有 10 个文件,它们的文件名中包含编号

例如:

b_100
b_101
b_102
b_103
b_104
b_105
b_106
b_107
b_108
b_109
b_110

我想 grep 查找 b_105 到 b_110 目录中的特定文件,并删除所有其余文件。意味着 b_100 b_101 b_102 b_103 b_104 将全部被删除/删除。

如果我要 grep 查找像 b_110 这样的目录中的一个文件,则删除所有未 grep 的内容。

答案1

zsh

setopt extendedglob
rm -rf -- ^b_<105-110>

将删除所有非隐藏文件和目录,但名称b_以十进制数字开头和结尾且其值介于 105 和 110 之间的文件和目录除外。

如果您只想删除b_*文件:

rm -rf -- b_(*~<105-110>)

~zsh全局运算符除了

或者你可以这样做:

all_b_files=(b_*)
to_exclude=(b_{105..110})
rm -rf -- ${all_b_files:|to_exclude}

ksh93bash -O extglob(或zsh -o kshglob):

set -- b_{105..110} # set positional parameters to b_105 b_106...
IFS='|'             # used for joining positional parameters in "$*"
pattern="$*"        # prepare extended ksh glob
IFS=                # empty IFS to prevent splitting
rm -rf -- !($pattern)

答案2

启用 bash 和扩展通配符后,您可以执行以下操作:

shopt -s extglob 
glob=$(echo b_{105..110} | sed 's/ /|/g')
rm -- !($glob)

首先将变量设置glob为以下输出:

$ echo b_{105..110} | sed 's/ /|/g'
b_105|b_106|b_107|b_108|b_109|b_110

因此,所需文件名的列表由|.然后,该命令rm -- !($glob)将删除所有不匹配的文件$glob

答案3

您可以使用 find 列出目录中所有不匹配的文件:

find /path/to/directory -not -name "file_name_to_keep" -type f

然后,您可以将 find 的输出通过管道传输到 xargs 中,或者仅使用 find 的内置 exec 或删除功能。

find /path/to/directory -not -name "file_name_to_keep" -type f -exec rm "{}" \;

或使用 GNU find 的内置删除选项

find /path/to/directory -not -name "file_name_to_keep" -type f -delete

关于基于 find 输出的各种删除方法的更多讨论:如何根据“find”输出删除目录?

答案4

我没有阅读整个问题,但是当你说“除了 grep 项目”时,这立即让我认为你不知道-vgrep 参数,这意味着“除了......之外的所有内容”,例如:

ls -ltra | grep -v .txt

这将显示除文本文件之外的所有文件的列表。

相关内容