所有的文件除了一些

使用sudo rm -r ,如何删除所有文件,但以下情况除外:

 textfile.txt backup.tar.gz script.php database.sql info.txt 

 find [path] -type f -not -name 'textfile.txt' -not -name 'backup.tar.gz' -delete 

如果你不指定-type f find也会列出你不想要的目录。


或者使用非常有用的组合find | xargs的更一般的解决scheme find | xargs

 find [path] -type f -not -name 'EXPR' -print0 | xargs -0 rm -- 

例如,删除当前目录中的所有非txt文件:

 find . -type f -not -name '*txt' -print0 | xargs -0 rm -- 

如果任何应该删除的文件名中有空格,则需要print0-0组合。

 rm !(textfile.txt|backup.tar.gz|script.php|database.sql|info.txt) 

需要在BASH中启用extglob(扩展模式匹配)(如果未启用):

 shopt -s extglob 

find . | grep -v "excluded files criteria" | xargs rm

这将列出当前目录中的所有文件,然后列出所有不符合条件的文件(注意与目录名称匹配),然后删除它们。

更新 :基于你的编辑,如果你真的想从当前目录中删除你列出的文件以外的所有东西,可以使用:

 mkdir /tmp_backup && mv textfile.txt backup.tar.gz script.php database.sql info.txt /tmp_backup/ && rm -r && mv /tmp_backup/* . && rmdir /tmp_backup 

它会创build一个备份目录/tmp_backup (你有root权限,对吧?),把你列出的文件移动到那个目录下,recursion地删除当前目录中的所有内容(你知道你在正确的目录下,是吗? ,从/tmp_backup回到当前目录,最后删除/tmp_backup

我select备份目录是根目录,因为如果你想从根目录recursion删除所有的东西,你的系统将会有很大的问题。

当然,有更多的优雅的方式来做到这一点,但这是非常简单的。

假设具有这些名称的文件存在于目录树中的多个位置,并且要保留所有这些文件:

 find . -type f ! -regex ".*/\(textfile.txt\|backup.tar.gz\|script.php\|database.sql\|info.txt\)" -delete 

你可以在Bash中使用GLOBIGNORE环境variables。

假设你想删除除php和sql之外的所有文件,那么你可以执行以下操作 –

 export GLOBIGNORE=*.php:*.sql rm * export GLOBIGNORE= 

像这样设置GLOBIGNORE会忽略像“ls *”或“rm *”这样的通配符的php和sql。 因此,设置variables后使用“rm *”将只删除txt和tar.gz文件。

由于没有人提到它:

  • 将您不想删除的文件复制到安全的地方
  • 删除所有的文件
  • 将复制的文件移回原位

有点迟到的OP,但希望有用的人谁得到更多的后来谷歌…

我通过@awifind了答案,并且@Jamie Bullock评论了这个答案真的很有用。 一个简单的实用程序,所以你可以在不同的目录下做到这一点,忽略不同的文件名/types,每次最less的打字:

rm_except(或任何你想命名它)

 #!/bin/bash ignore="" for fignore in "$@"; do ignore=${ignore}"-not -name ${fignore} " done find . -type f $ignore -delete 

例如删除除文本文件和foo.bar以外的所有内容:

 rm_except *.txt foo.bar 

类似于@mishunika,但没有if子句。

你可以写一个for循环这个…%)

 for x in * do if [ "$x" != "exclude_criteria" ] then rm -f $x; fi done; 

尝试使用它:

 rm -r !(Applications|"Virtualbox VMs"|Downloads|Documents|Desktop|Public) 

但有空格的名字是(一如既往)艰难。 也尝试使用Virtualbox\ VMs而不是引号。 它总是删除那个目录( Virtualbox VMs )。

我更喜欢使用子查询列表:

 rm -r `ls | grep -v "textfile.txt\|backup.tar.gz\|script.php\|database.sql\|info.txt"` 

-v,–invert-matchselect不匹配的行

\| 分隔器

如果你使用的是我强烈推荐的zsh

 rm -rf ^file/folder pattern to avoid 

extended_glob

 setopt extended_glob rm -- ^*.txt rm -- ^*.(sql|txt) 

只是:

 rm $(ls -I "*.txt" ) #Deletes file type except *.txt 

要么:

 rm $(ls -I "*.txt" -I "*.pdf" ) #Deletes file types except *.txt & *.pdf 

这与@ siwei-shen的评论类似,但是你需要-o标志来做多种模式。 -o标志代表“或”

find . -type f -not -name '*ignore1' -o -not -name '*ignore2' | xargs rm

你可以使用行命令来做到这一点,首先定义一个数组,你不想排除的文件的名称

 $ files=( backup.tar.gz script.php database.sql info.txt ) 

在循环遍历要排除的目录中的所有文件之后,检查文件名是否在arrays中,而不是要排除,如果不存在,则删除该文件。

 $ for file in $(ls); do if [[ ! " ${files[@]} " ~= "$file" ]];then rm "$file";fi;done 

就是这个!

而不是去直接的命令,请将所需的文件移动到当前目录以外的临时目录。 然后使用rm *rm -r *删除所有文件。

然后将所需的文件移动到当前目录。