使用sudo rm -r
时,如何删除所有文件,但以下情况除外:
textfile.txt
backup.tar.gz
script.php
database.sql
info.txt
答案 0 :(得分:206)
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
组合。
答案 1 :(得分:148)
rm !(textfile.txt|backup.tar.gz|script.php|database.sql|info.txt)
需要在BASH中启用extglob(扩展模式匹配)(如果未启用):
shopt -s extglob
答案 2 :(得分:39)
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
它会创建一个备份目录/tmp_backup
(你有root权限,对吗?),将列出的文件移动到该目录,递归删除当前目录中的所有内容(你知道你在右边)目录,是吗?),从/tmp_backup
移回当前目录,最后删除/tmp_backup
。
我选择备份目录是root用户,因为如果你试图从root用户删除所有内容,那么你的系统就会出现大问题。
当然有更优雅的方法可以做到这一点,但这个方法非常简单。
答案 3 :(得分:19)
您可以在Bash中使用GLOBIGNORE环境变量。
假设您要删除除php和sql之外的所有文件,那么您可以执行以下操作 -
export GLOBIGNORE=*.php:*.sql
rm *
export GLOBIGNORE=
像这样设置GLOBIGNORE会忽略使用像“ls *”或“rm *”这样的通配符的php和sql。因此,在设置变量后使用“rm *”将仅删除txt和tar.gz文件。
答案 4 :(得分:18)
假设具有这些名称的文件存在于目录树的多个位置,并且您希望保留所有这些文件:
find . -type f ! -regex ".*/\(textfile.txt\|backup.tar.gz\|script.php\|database.sql\|info.txt\)" -delete
答案 5 :(得分:15)
我更喜欢使用子查询列表:
rm -r `ls | grep -v "textfile.txt\|backup.tar.gz\|script.php\|database.sql\|info.txt"`
-v, - 反向匹配选择不匹配的行
\|
分隔符
答案 6 :(得分:9)
由于没人提到它:
答案 7 :(得分:6)
对于OP来说有点晚了,但希望对于那些稍后来谷歌的人来说很有用......
我找到了@awi的回答并且@Jamie Bullock对-delete的评论非常有用。一个简单的实用程序,因此您可以在不同的目录中执行此操作,每次使用最少的类型忽略不同的文件名/类型:
rm_except(或任何你想要的名字)
#!/bin/bash
ignore=""
for fignore in "$@"; do
ignore=${ignore}"-not -name ${fignore} "
done
find . -type f $ignore -delete
e.g。删除除文本文件和foo.bar之外的所有内容:
rm_except *.txt foo.bar
与@mishunika相似,但没有if子句。
答案 8 :(得分:5)
你可以为此写一个for循环...%)
for x in *
do
if [ "$x" != "exclude_criteria" ]
then
rm -f $x;
fi
done;
答案 9 :(得分:5)
如果您使用{强烈推荐的zsh
。
rm -rf ^file/folder pattern to avoid
使用extended_glob
setopt extended_glob
rm -- ^*.txt
rm -- ^*.(sql|txt)
答案 10 :(得分:4)
尝试使用:
rm -r !(Applications|"Virtualbox VMs"|Downloads|Documents|Desktop|Public)
但是带空格的名字(一如既往)很难。也尝试用Virtualbox\ VMs
而不是引号。它始终删除该目录(Virtualbox VMs
)。
答案 11 :(得分:4)
只需:
rm $(ls -I "*.txt" ) #Deletes file type except *.txt
或者:
rm $(ls -I "*.txt" -I "*.pdf" ) #Deletes file types except *.txt & *.pdf
答案 12 :(得分:1)
我相信您可以使用
import tensorflow as tf
from tensorflow.keras import Input
from tensorflow.keras.layers import LocallyConnected1D
batch_size = 8
num_classes = 10
inp = Input(shape=(1024, 256))
layer = LocallyConnected1D(num_classes, 1, activation='softmax')
out = layer(inp)
print(out.shape)
# (None, 1024, 10)
print(layer.count_params())
# 2631680
除文件名外,所有其他文件都将在目录中删除,并确保您在其中使用它
答案 13 :(得分:1)
使文件不可变。甚至根也不允许删除它们。
chattr +i textfile.txt backup.tar.gz script.php database.sql info.txt
rm *
所有其他文件都已删除 最终你可以重置它们是可变的。
chattr -i *
答案 14 :(得分:0)
您可以使用两个命令序列执行此操作。 首先使用您不想排除的文件名称定义一个数组:
files=( backup.tar.gz script.php database.sql info.txt )
之后,循环浏览要排除的目录中的所有文件,检查文件名是否在您不想排除的数组中;如果不是那么删除文件。
for file in *; do
if [[ ! " ${files[@]} " ~= "$file" ]];then
rm "$file"
fi
done
答案 15 :(得分:0)
这类似于@ siwei-shen的评论,但您需要-o
标志来执行多种模式。 -o
标志代表'或'
find . -type f -not -name '*ignore1' -o -not -name '*ignore2' | xargs rm
答案 16 :(得分:-1)
由于在某个特定情况下没有人提到这一点:
OLD_FILES=`echo *`
... create new files ...
rm -r $OLD_FILES
(或只是rm $OLD_FILES
)
或
OLD_FILES=`ls *`
... create new files ...
rm -r $OLD_FILES
如果某些文件可能存在或不存在,则可能需要使用shopt -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”。
(说了这么多,我自己更喜欢this answer,即使它在OSX中不起作用)
答案 17 :(得分:-2)
删除所有排除文件名的文件:
ls -d /path/to/your/files/* |grep -v file.name|xargs rm -rf
答案 18 :(得分:-3)
请将所需文件移至当前目录外的临时目录,而不是直接命令。然后使用rm *
或rm -r *
删除所有文件。
然后将所需文件移动到当前目录。