我在一个特定文件夹中有很多文件和文件夹,我想全部删除它们;但是,我想保留文件 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)
使用 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)
但是,您可能应该将文件移到别处,然后删除所有内容。就手指滑动而言,它要安全得多,例如过早点击进入。
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)
更高版本的 bash 具有extglob
shell 选项,该选项为您提供执行所需操作的语法(检查“路径名扩展”下的手册页以查看您安装的版本是否有它):
$ shopt -s extglob # turn on extended globbing
$ rm !(X|Y|Z)
Run Code Online (Sandbox Code Playgroud)
为了测试,我建议您先替换rm
为echo
,看看要删除的文件列表是否符合您的预期。