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

mas*_*oko 207 bash rm

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

textfile.txt
backup.tar.gz
script.php
database.sql
info.txt
Run Code Online (Sandbox Code Playgroud)

awi*_*awi 214

find [path] -type f -not -name 'textfile.txt' -not -name 'backup.tar.gz' -delete
Run Code Online (Sandbox Code Playgroud)

如果您没有指定-type ffind,还会列出您可能不想要的目录.


或者使用非常有用的组合的更通用的解决方案find | xargs:

find [path] -type f -not -name 'EXPR' -print0 | xargs -0 rm --
Run Code Online (Sandbox Code Playgroud)

例如,删除当前目录中的所有非txt文件:

find . -type f -not -name '*txt' -print0 | xargs -0 rm --
Run Code Online (Sandbox Code Playgroud)

print0-0是否有任何应该被删除的文件名的空间需要组合.

  • 而不是"| xargs rm",find取一个-delete参数. (30认同)
  • 删除多个模式:`find.-type f -not -name'*ignore1'-not -name'*ignore2'| xargs rm` (25认同)
  • 目录怎么样?它会删除所有文件,但它会删除文件夹吗?! (5认同)
  • 似乎xargs有文本大小限制 (2认同)

pl1*_*1nk 149

rm !(textfile.txt|backup.tar.gz|script.php|database.sql|info.txt)
Run Code Online (Sandbox Code Playgroud)

需要在BASH中启用extglob(扩展模式匹配)(如果未启用):

shopt -s extglob
Run Code Online (Sandbox Code Playgroud)

  • @nic,@ Dennis:语法错误表明使用了除"bash"以外的东西,例如`dash`,其中不支持`extglob`.但是,在_interactive_`bash` shell中,虽然出于不同的原因,该命令也不会按照规定工作.缺点:执行`shopt -s extglob` BY ITSELF; 一旦成功启用(用`shopt extglob`验证),执行`rm -rf!(README | LICENSE)`.(虽然`extglob`尚未启用,`!(...)`由_history expansion_评估执行命令之前;因为这可能会失败,执行NEITHER命令,并且`extglob`永远不会打开.) (3认同)
  • 我得到"意外令牌附近的语法错误\"(''当我做'shopt -s extglob; rm -rf!(README | LICENSE)`.任何想法为什么? (2认同)
  • @nic,@ Dennis,@ mklement0:我遇到了"意外令牌附近的语法错误("在.sh文件(#!/ bin/bash)中执行命令时)的问题,但是当我在命令中运行它时却没有事实证明,除了在命令行界面中运行的`shopt -s extglob`之外,我还必须在我的脚本文件中重新运行它.这解决了我的问题. (2认同)

dar*_*ioo 40

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
Run Code Online (Sandbox Code Playgroud)

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

我选择备份目录是root用户,因为如果你试图从root中递归删除所有内容,那么你的系统就会遇到很大问题.

当然有更优雅的方法来做到这一点,但这个方法非常简单.

  • 'xargs rm'而不是'rm' (2认同)
  • 与egrep一起工作也非常好,例如用于清洁中间乳胶文件:`find.| egrep -v"\ .tex |\.bib"| xargs rm` (2认同)

the*_*est 19

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

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

export GLOBIGNORE=*.php:*.sql
rm *
export GLOBIGNORE=
Run Code Online (Sandbox Code Playgroud)

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

  • +1; 设置和恢复`GLOBIGNORE`变量的一个更简单的替代方法是使用子shell:`(GLOBIGNORE ='*.php:*.sql'; rm*)` (6认同)

Pau*_*ce. 18

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

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


Nic*_*sai 16

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

rm -r `ls | grep -v "textfile.txt\|backup.tar.gz\|script.php\|database.sql\|info.txt"`
Run Code Online (Sandbox Code Playgroud)

-v, - inverse-match选择不匹配的行

\| 分隔器


gni*_*urf 9

既然没有人提到它:

  • 将您不想删除的文件复制到安全的地方
  • 删除所有文件
  • 将复制的文件移回原位

  • 它更复杂,因为您在复制后必须处理权限. (2认同)
  • @RemusAvram您可以使用带有`cp`或`rsync`的适当开关来保留权限.无论如何,这只是一个替代方法(作​​为建议给出)在这里有它的位置,作为OP的答案. (2认同)

小智 6

你可以为此写一个for循环...%)

for x in *
do
        if [ "$x" != "exclude_criteria" ]
        then
                rm -f $x;
        fi
done;
Run Code Online (Sandbox Code Playgroud)


小智 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
Run Code Online (Sandbox Code Playgroud)

例如删除除文本文件和foo.bar之外的所有内容:

rm_except *.txt foo.bar 
Run Code Online (Sandbox Code Playgroud)

与@mishunika类似,但没有if子句.


sud*_*ang 5

如果您使用的zsh是我强烈推荐的方式。

rm -rf ^file/folder pattern to avoid
Run Code Online (Sandbox Code Playgroud)

extended_glob

setopt extended_glob
rm -- ^*.txt
rm -- ^*.(sql|txt)
Run Code Online (Sandbox Code Playgroud)