删除文件夹中除文件X,Y和Z以外的所有文件


17

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

有什么办法可以做类似的事情: rm * | but NOT grep | X or Y or Z


我想我可以在其中使用一些正则表达式来做到这一点?
阿米特(Amit)

Answers:


16

代替使用rm,使用find可能更容易。像这样的命令将删除除名为“ file”的文件以外的所有内容

find . \! -name 'file' -delete

的许多版本都应该能够支持全局和正则表达式匹配。

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

find . \! -name '*pattern*' -print0 | xargs --null rm 

3
这样一来,您可以确切地看到通过删除和将删除哪些文件-delete,以及通过删除-delete和将保存的文件\!
肖恩·高夫

1
小心,find是递归的!因此所有不匹配“ pattern ”的文件子目录也将被删除
Alexandre Holden Daly

通过xargs的方法需要-depth,以防止尝试删除包含在其中的文件之前的目录。但是,我认为rm也不会删除目录。
用户未知

9

使用zsh和setopt EXTENDED_GLOB,使用~运算符(除外

rm -- *~(x|y|z)

^运算符(否定):

rm -- ^(x|y|z)

但是,您可能应该改为将文件移到其他位置,然后删除所有内容。就手指打滑(例如过早敲击Enter)而言,这要安全得多。


5

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

$ shopt -s extglob  # turn on extended globbing
$ rm !(X|Y|Z)

为了进行测试,建议您首先替换为rmecho以查看是否要删除文件列表。


5
ls -1 | grep -v "^[XYZ]$" # | xargs rm -r

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

如果文件名更复杂,那就这样做

ls -1 | egrep -v "^file1$|^filename2$|^f1le$" # | xargs rm -r

再次,首先查看结果,然后删除哈希符号。

如注释中所建议,此版本节省了一些字符,看起来也更加清晰。

ls -1 | egrep -v "^(file1|filename2|f1le)$" # | xargs rm -r

ddeimeke的建议编辑是将egrep论点更改为"^(file1|filename2|f1le)$"
Michael Mrozek

如果你有三个文件aba b第一个程序会删除-如果你把AB到grep的部分:"^[ab]$" ab,但没有a b,只是反对你的意图。第二个命令将执行相同的操作。第三也是。除了非常非常罕见的例外,您不应在脚本中使用“ ls”。只是不要这样做。
用户未知,

3

移动要保留的文件。上一层,删除文件夹。重新创建文件夹,然后将这些文件移回。


我不知道为什么要减去负号。.实际上,它比其他任何提议都更容易和安全:您根本无法通过击中文件名中的某些特殊字符来射击自己。
alex

a)您将文件X移动到一个存在文件X的目录上-静默删除,消失了。b)您位于顶部目录,其中不存在“ up”。C)你在你的家中,并没有权限写入到/ home。如果您将建议放入脚本中,并且没有问题地对其进行了测试,并在这种情况下使用它-彭!
用户未知

2
a)嘿,我是否说过“将文件移一级”?我说过将它们移开。b)因此,您正在尝试删除中的所有文件/,对吗?不太实用。c)尝试删除您自己的所有文件$HOME也不是切实可行的。
Alex

您说得对,对不起。
用户未知

0

这就是我为OSX / MacOS注销钩子设置为.sh脚本的方式,效果很好。

#! /bin/bash
for dir in /PathToFolder/*
 do
    if [ ! "$dir" = "/PathToFolder/FolderToKeep1" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep2" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep3" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep4" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep5" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep6" ] ; then 
      echo ${dir}
      sudo rm -R $dir user
      dscl . -delete $dir
    fi 
  done

exit 0

0

使用GNU-find,您可以使用-delete开关,如果空的话,它也会删除目录:

 find tmp -not -name X -not -name Y -not -name Z -delete 

如果X,Y或Z是目录,这也会删除其中的文件。find tmp -maxdepth 1 -not -name X -not -name Y -not -name Z -delete是解决此问题的一种方法。
吉尔斯(Gilles)“所以,别再邪恶了”,

由于Unix下的文件夹是文件(任何东西都是文件),所以这可能就是目的。问题明确指出:“我在一个特定的文件夹中有很多文件和文件夹,我想删除所有这些文件和文件夹;”-并且,如果您想排除Y,也许您知道Y是否为目录。
用户未知,

这将最终删除tmp,以及如果没有X/ Y/ Z文件进去。注!为GNU的标准当量-not-delete也是GNU扩展)
斯特凡Chazelas

@StéphaneChazelas:从这个问题开始,要删除文件夹(全部)。由于爆炸需要掩盖,因此我更喜欢输入-not。可能取决于德语键盘的布局,其中反斜杠需要使用Alt-Gr。
用户未知
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.