使用sudo rm -r时,如何删除除以下文件外的所有文件?
textfile.txt
backup.tar.gz
script.php
database.sql
info.txt
使用sudo rm -r时,如何删除除以下文件外的所有文件?
textfile.txt
backup.tar.gz
script.php
database.sql
info.txt
当前回答
试着这样做:
rm -r !(Applications|"Virtualbox VMs"|Downloads|Documents|Desktop|Public)
但是带空格的名字(一如既往)很难取。也尝试用Virtualbox\ VMs代替引号。它总是删除该目录(Virtualbox vm)。
其他回答
这类似于@siwei-shen的评论,但是您需要-o标志来处理多个模式。-o标志代表'or'
找到。-o -not -name '*ignore2' | xargs rm . type f -not -name '*ignore1' -o -not -name '*ignore2
找到。| 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。
我选择将备份目录放在根目录下,因为如果您试图从根目录中递归地删除所有内容,那么您的系统将会出现大问题。
当然,还有更优雅的方法可以做到这一点,但这个方法非常简单。
删除除file.name以外的所有内容:
ls -d /path/to/your/files/* |grep -v file.name|xargs rm -rf
您可以使用两个命令序列来完成此操作。 首先定义一个数组,其中包含你不想排除的文件的名称:
files=( backup.tar.gz script.php database.sql info.txt )
在此之后,循环遍历你想要排除的目录中的所有文件,检查文件名是否在你不想排除的数组中;如果不是,然后删除文件。
for file in *; do
if [[ ! " ${files[@]} " ~= "$file" ]];then
rm "$file"
fi
done
我更喜欢使用子查询列表:
rm -r `ls | grep -v "textfile.txt\|backup.tar.gz\|script.php\|database.sql\|info.txt"`
-v,——invert-match选择不匹配的行 \ |分隔符