从目录中删除除一些文件以外的所有文件

时间:2010-12-01 14:13:11

标签: bash rm

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

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

19 个答案:

答案 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 *删除所有文件。

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