使用find – 删除除Linux以外的所有文件/目录

如果我们要删除所有我们使用的文件和目录, rm -rf *

但是,如果我想要删除所有的文件和目录,除了一个特定的文件?

有什么指令吗? rm -rf *一次删除容易,但是甚至删除我最喜欢的文件/目录。

提前致谢

Solutions Collecting From Web of "使用find – 删除除Linux以外的所有文件/目录"

find可以是一个非常好的朋友:

 $ ls a/ b/ c/ $ find * -maxdepth 0 -name 'b' -prune -o -exec rm -rf '{}' ';' $ ls b/ $ 

说明:

  • find * -maxdepth 0 :选择*所选的所有内容,而不下降到任何目录

  • -name 'b' -prune :不要打扰( -prune )与条件匹配的任何东西-name 'b'

  • -o -exec rm -rf '{}' ';' :所有其他的请致电rm -rf

顺便说一句,另一个可能更简单的方法是移动或重命名你最喜欢的目录,以免妨碍它:

 $ ls a/ b/ c/ $ mv b .b $ ls a/ c/ $ rm -rf * $ mv .bb $ ls b/ 

简短的回答

 ls | grep -v "z.txt" | xargs rm 

详情

上述命令的思想过程是:

  • 列出所有文件( ls
  • 列出除了所选文件(grep -v“z.txt”)以外的所有文件
  • 删除列出的文件(xargs rm)

创建5个文件,如下所示:

 echo "a.txt b.txt c.txt d.txt z.txt" | xargs touch 

列出除z.txt以外的所有文件

 ls|grep -v "z.txt" a.txt b.txt c.txt d.txt 

我们现在可以使用xargs工具删除(rm)列出的文件:

 ls|grep -v "z.txt"|xargs rm 

您可以在命令行中直接输入,也可以在脚本中使用此按键

 files=`ls -l | grep -v "my_favorite_dir"`; for file in $files; do rm -rvf $file; done 

PS我建议-i切换rm以防止重要数据的删除。

PPS您可以根据此解决方案编写小脚本,并将其放在/usr/bin (例如/usr/bin/rmf )中。 现在你可以使用它和普通的应用程序:

 rmf my_favorite_dir 

脚本看起来像(只是一个草图):

 #!/bin/sh if [[ -z $1 ]]; then files=`ls -l` else files=`ls -l | grep -v $1` fi; for file in $files; do rm -rvi $file done; 

至少在zsh中

 rm -rf ^filename 

可以是一个选项,如果你只想保留一个单一的文件。

如果它只是一个文件,一个简单的方法就是将该文件移动到/tmp或其他东西, rm -Rf目录,然后将其移回。 你可以把它作为一个简单的命令。

另一个选择是做一个find ,然后grep你不想要的东西(使用-v或直接使用find谓词之一),然后把剩下的文件打包。

对于单个文件,我会做前者。 除此之外,我会写一些类似于特卡拉所说的定制。

在bash中,您有!() glob运算符,它将匹配的模式进行反转。 因此,要删除文件my_file_name.txt以外的所有内容,请尝试以下操作:

 shopt -s extglob rm -f !(my_file_name.txt) 

有关更多详细信息,请参阅此文章: http : //karper.wordpress.com/2010/11/17/deleting-all-files-in-a-directory-with-exceptions/

我不知道有这样一个计划,但我曾经想过一段时间。 基本的语法是:

 IFS=' ' for f in $(except "*.c" "*.h" -- *); do printf '%s\n' "$f" done 

我心目中的计划有三种模式:

  • 完全匹配(与选项-e
  • glob匹配(默认,如上例所示)
  • 正则表达式匹配(使用-r选项)

它将模式从命令行中排除,然后是分隔符,然后是文件名。 或者,可以从stdin读取文件名(如果给出了选项-s ),则每个文件都在一行中。

用C或Shell命令语言编写这样的程序不难。 学习Unix基础知识是一个很好的练习。 当你作为一个shell程序来做的时候,当然你必须注意包含空格和其他特殊字符的文件名。

我在这里看到了很多意想不到的方法,那就是用a / b / c / d / e /

  rm -rf *.* !(b*) 

这将除去目录b和其内容(假设你的文件在b /中),然后只是cd b /和

 rm -rf *.* !(filename) 

删除其他所有内容,但要保留的文件(名为“文件名”)。

 mv subdir/preciousfile ./ rm -rf subdir mkdir subdir mv preciousfile subdir/ 

这看起来很乏味,但是相当安全

  • 避免了复杂的逻辑
  • 从不使用rm -rf * ,其结果取决于你当前的目录(可能是/ 😉
  • 从不使用globbing * :它的扩展受到ARGV_MAX的限制。
  • 允许您在每个命令之后检查错误,也许可以避免下一个命令造成的灾难。
  • 避免了文件名空间或NL造成的讨厌问题。
 cd .. ln trash/useful.file ./ rm -rf trash/* mv useful.file trash/ 

你需要使用这个正则表达式。 写一个正则表达式来选择除你需要的其他文件之外的所有其他文件。