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

Chr*_*ten 3 bash ksh

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

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

如:

b_100
b_101
b_102
b_103
b_104
b_105
b_106
b_107
b_108
b_109
b_110
Run Code Online (Sandbox Code Playgroud)

我想对目录中从 b_105 到 b_110 的特定文件进行 grep 并删除所有其余文件。意思是 b_100 b_101 b_102 b_103 b_104 都将被移除/删除。

如果我想在像 b_110 这样的目录中搜索一个文件,那么删除所有没有搜索到的内容。

Sté*_*las 6

zsh

setopt extendedglob
rm -rf -- ^b_<105-110>
Run Code Online (Sandbox Code Playgroud)

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

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

rm -rf -- b_(*~<105-110>)
Run Code Online (Sandbox Code Playgroud)

~zshglob 运算符,用于except

或者你可以这样做:

all_b_files=(b_*)
to_exclude=(b_{105..110})
rm -rf -- ${all_b_files:|to_exclude}
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)