我有很多文件和特定文件夹中的子文件夹,我想删除所有这些子文件夹;但是,我想保留文件 X、Y 和 Z。
有没有办法我可以做类似的事情:
rm * | but NOT grep | X or Y or Z
答案1
代替使用rm,使用可能更方便寻找。像这样的命令会删除除名为“file”的文件之外的所有内容
find . \! -name 'file' -delete
许多版本应该能够支持通配和正则表达式匹配。
您也可以将 find 的输出通过管道传输到 rm
find . \! -name '*pattern*' -print0 | xargs --null rm
答案2
使用 zsh、with setopt EXTENDED_GLOB
、使用~
运算符 (除了)
rm -- *~(x|y|z)
或^
运算符(否定):
rm -- ^(x|y|z)
但是,您可能应该将文件移动到其他地方,然后删除所有内容。就手指滑动而言,例如过早按回车键,它要安全得多。
答案3
bash 的更高版本有extglob
shell 选项,它为您提供了执行您想要的操作的语法(检查“路径名扩展”下的手册页以查看您安装的版本是否有它):
$ shopt -s extglob # turn on extended globbing
$ rm !(X|Y|Z)
为了进行测试,我建议您首先替换rm
为,echo
看看要删除的文件列表是否是您所期望的。
答案4
移动您想要保留的文件。上一级,删除文件夹。重新创建文件夹并将这些文件移回。