使用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:

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 -v !(filename)

除了文件名,所有其他文件将删除在该目录中,并确保您正在使用它

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

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

在Bash中可以使用GLOBIGNORE环境变量。

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

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

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

这次行动有点晚了,但希望对那些晚到的人有用……

我发现@awi的答案和jamie Bullock对-delete的评论非常有用。一个简单的实用工具,这样你可以在不同的目录中忽略不同的文件名/类型,每次输入最少:

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子句。

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

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

-v,——invert-match选择不匹配的行 \ |分隔符