使用find - 删除除任何一个之外的所有文件/目录(在Linux中)

时间:2011-04-14 06:41:48

标签: linux file shell

如果我们要删除我们使用的所有文件和目录,rm -rf *

但是如果我希望一次删除所有文件和目录,除了一个特定的文件?

有没有命令呢? rm -rf *一次性易于删除,但删除了我最喜欢的文件/目录。

提前致谢

11 个答案:

答案 0 :(得分:30)

find可以成为非常好的朋友:

$ ls
a/  b/  c/
$ find * -maxdepth 0 -name 'b' -prune -o -exec rm -rf '{}' ';'
$ ls
b/
$ 

说明:

  • find * -maxdepth 0:选择*选择的所有内容而不降入任何目录

  • -name 'b' -prune:不要打扰(-prune)任何符合条件-name 'b'

  • 的内容
  • -o -exec rm -rf '{}' ';':为其他所有内容致电rm -rf

顺便说一句,另一种可能更简单的方法是移动或重命名收藏目录,使其不会妨碍:

$ ls
a/  b/  c/
$ mv b .b
$ ls
a/  c/
$ rm -rf *
$ mv .b b
$ ls
b/

答案 1 :(得分:9)

简短回答

ls | grep -v "z.txt" | xargs rm

<强>详情:

上述命令的思考过程是:

  • 列出所有文件(ls)
  • 忽略一个名为“z.txt”的文件(grep -v“z.txt”)
  • 删除z.txt(xargs rm)
  • 以外的列出文件

实施例

创建5个文件,如下所示:

echo "a.txt b.txt c.txt d.txt z.txt" | xargs touch

列出除z.txt

以外的所有文件
ls|grep -v "z.txt"

a.txt
b.txt
c.txt
d.txt

我们现在可以使用 xargs 实用程序删除(rm)列出的文件:

ls|grep -v "z.txt"|xargs rm

答案 2 :(得分:2)

您可以在命令行中键入它,或在脚本中使用此键击

files=`ls -l | grep -v "my_favorite_dir"`; for file in $files; do rm -rvf $file; done

P.S。我建议-i切换rm以防止重要数据的删除。

P.P.S您可以根据此解决方案编写小脚本并将其放入/usr/bin(例如/usr/bin/rmf)。现在您可以将它用作普通应用程序:

rmf my_favorite_dir

脚本看起来像(只是草图):

#!/bin/sh

if [[ -z $1 ]]; then
    files=`ls -l`
else
    files=`ls -l | grep -v $1`
fi;

for file in $files; do
    rm -rvi $file
done;

答案 3 :(得分:2)

至少在zsh

rm -rf ^filename
如果您只想保留一个文件,

可以是一个选项。

答案 4 :(得分:1)

如果它只是一个文件,一种简单的方法是将该文件移动到/tmp或其他内容,rm -Rf目录,然后将其移回。您可以将其命名为简单命令。

另一种选择是执行find,然后grep执行您不想要的内容(使用-v或直接使用find个谓词之一)和然后rm剩下的文件。

对于单个文件,我会做前者。除此之外,我还会写一些类似于thkala所说的定制。

答案 5 :(得分:1)

在bash中你有!() glob运算符,它反转了匹配的模式。因此,要删除文件my_file_name.txt以外的所有内容,请尝试以下操作:

shopt -s extglob
rm -f !(my_file_name.txt)

有关详细信息,请参阅此文章: http://karper.wordpress.com/2010/11/17/deleting-all-files-in-a-directory-with-exceptions/

答案 6 :(得分:0)

我不知道这样的节目,但过去我曾经想过它。基本语法是:

IFS='
' for f in $(except "*.c" "*.h" -- *); do
  printf '%s\n' "$f"
done

我想到的程序有三种模式:

  • 完全匹配(使用选项-e
  • glob匹配(默认,如上例所示)
  • 正则表达式匹配(使用选项-r

从命令行中排除模式,然后是分隔符--,后跟文件名。或者,可以从stdin(如果给出选项-s)读取文件名,每个文件名都在一行上。

这样的程序不应该用C或Shell命令语言来编写。它是学习Unix基础知识的一个很好的练习。当你将它作为shell程序执行时,你必须注意包含空格和其他特殊字符的文件名。

答案 7 :(得分:0)

我在这里看到了许多冗长的意思,那是有效的,但有了 a / b / c / d / e /

 rm -rf *.* !(b*) 

这将删除除目录b /及其内容之外的所有内容(假设您的文件位于b /中)。 然后只需cd b /和

rm -rf *.* !(filename) 

删除其他所有内容,但删除要保留的文件(名为“filename”)。

答案 8 :(得分:0)

mv subdir/preciousfile  ./
rm -rf subdir
mkdir subdir
mv preciousfile subdir/

这看起来很乏味,但相当安全

  • 避免复杂的逻辑
  • 从不使用rm -rf *,其结果取决于您当前的目录(可能是/; - )
  • 从不使用全局*:其扩展受ARGV_MAX限制。
  • 允许您在每个命令之后检查错误,并且可以避免由下一个命令引起的灾难。
  • 避免文件名中由空格或NL引起的令人讨厌的问题。

答案 9 :(得分:0)

cd ..
ln trash/useful.file ./
rm -rf trash/*
mv useful.file trash/

答案 10 :(得分:-1)

你需要使用正则表达式。编写一个正则表达式,选择除了你需要的文件之外的所有其他文件。