删除文件夹中除 X、Y 和 Z 文件之外的所有文件

Ami*_*mit 22 command-line rm

我在一个特定文件夹中有很多文件文件夹,我想全部删除它们;但是,我想保留文件 X、Y 和 Z。

有没有办法我可以做这样的事情: rm * | but NOT grep | X or Y or Z

Zor*_*che 22

与使用 rm 不同,使用find可能更容易。像这样的命令将删除除完全命名为“file”的文件之外的所有内容

find . \! -name 'file' -delete
Run Code Online (Sandbox Code Playgroud)

许多版本应该能够支持通配符和正则表达式匹配。

您也可以将 find 的输出通过管道传输到 rm

find . \! -name '*pattern*' -print0 | xargs --null rm 
Run Code Online (Sandbox Code Playgroud)

  • 这让您可以确切地看到通过删除 `-delete` 将删除哪些文件,以及通过删除 `-delete` 和 `\!` 将保存哪些文件。 (3认同)

wno*_*ise 9

使用 zsh, with setopt EXTENDED_GLOB, 使用~操作符 ( except )

rm -- *~(x|y|z)
Run Code Online (Sandbox Code Playgroud)

^运算符(否定):

rm -- ^(x|y|z)
Run Code Online (Sandbox Code Playgroud)

但是,您可能应该将文件移到别处,然后删除所有内容。就手指滑动而言,它要安全得多,例如过早点击进入。


dde*_*eke 7

ls -1 | grep -v "^[XYZ]$" # | xargs rm -r
Run Code Online (Sandbox Code Playgroud)

注意:运行该命令,如果要删除的文件是正确的,则再次运行该命令并删除哈希字符“#”。

如果文件名更复杂,那么做

ls -1 | egrep -v "^file1$|^filename2$|^f1le$" # | xargs rm -r
Run Code Online (Sandbox Code Playgroud)

同样,首先查看结果,然后删除井号。

这个版本 - 正如评论中所建议的 - 保存了一些字符并且看起来更清晰一些。

ls -1 | egrep -v "^(file1|filename2|f1le)$" # | xargs rm -r
Run Code Online (Sandbox Code Playgroud)


cam*_*amh 6

更高版本的 bash 具有extglobshell 选项,该选项为您提供执行所需操作的语法(检查“路径名扩展”下的手册页以查看您安装的版本是否有它):

$ shopt -s extglob  # turn on extended globbing
$ rm !(X|Y|Z)
Run Code Online (Sandbox Code Playgroud)

为了测试,我建议您先替换rmecho,看看要删除的文件列表是否符合您的预期。