使用sudo rm -r时,如何删除除以下文件外的所有文件?

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

当前回答

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

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

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

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

其他回答

找到。| grep -v "排除的文件条件" | 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

它将创建一个备份目录/tmp_backup(您有根权限,对吧?),将您列出的文件移动到该目录,递归地删除当前目录中的所有内容(您知道您在正确的目录,对吗?),将/tmp_backup中的所有内容移回当前目录,最后删除/tmp_backup。

我选择将备份目录放在根目录下,因为如果您试图从根目录中递归地删除所有内容,那么您的系统将会出现大问题。

当然,还有更优雅的方法可以做到这一点,但这个方法非常简单。

只是:

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

Or:

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

使文件不可变。即使root用户也不允许删除它们。

chattr +i textfile.txt backup.tar.gz script.php database.sql info.txt
rm *

所有其他文件都已删除。 最终你可以将它们重置为可变的。

chattr -i *

由于还没有人提到这一点,在一个特定的案例中:

OLD_FILES=`echo *`
... create new files ...
rm -r $OLD_FILES

(或者只是rm $OLD_FILES)

or

OLD_FILES=`ls *`
... create new files ...
rm -r $OLD_FILES

你可能需要使用shop -s nullglob,如果一些文件可能在那里或不在那里:

SET_OLD_NULLGLOB=`shopt -p nullglob`
shopt -s nullglob
FILES=`echo *.sh *.bash`
$SET_OLD_NULLGLOB

如果没有nullglob,则echo *.sh *。Bash可能会给你“a.sh b.sh *. Bash”。

(说了这么多,我自己更喜欢这个答案,即使它在OSX中不起作用)

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组合。