如何删除目录中的所有文件?


76

我正在尝试删除目录中的所有文件和子目录。我曾经rm -r删除所有文件,但我想删除所有文件子目录,顶层目录本身除外。

例如,我有一个顶级目录,例如images。它所包含的文件header.pngfooter.png和一个子目录。

现在我想删除header.pngfooter.png和子目录,但不是images

我如何在Linux中做到这一点?


1
cd进入目录,然后执行其中rm -Rf的所有文件和目录。
Noufal Ibrahim

Answers:


59

如果您的顶级目录被调用images,请运行rm -r images/*。这使用shell glob运算符在中的每个文件或目录上*运行。rm -rimages


30
隐藏的文件不会被删除。
雷托

50

要删除隐藏文件,您必须指定:

rm -r images/* images/.*

对于其glob包括.和的shell ..,这将导致类似的错误

rm: cannot remove `.' directory `images/.'
rm: cannot remove `..' directory `images/..'

但是它将删除隐藏文件。

一种没有错误消息的方法是使用具有最小深度的查找/删除。这是非常恰当的。

find images -mindepth 1 -delete

您的发现可能缺少-mindepth-delete谓词,在这种情况下,您可以这样做:

find images/. ! -name . -prune -exec rm -rf {} +

我的建议是使用与“ images / ..”相匹配的“ rm -r images /.*”,而不是“ images /../ ..”。递归不能向上,因为'images /../ images / ..'还是同一目录。
不明的使用者

4
@DarkHeart rm .*不会删除...人自至少1994年的GNU utils的和可能的,因为70年代末的UNIX。您极不可能找到在rm .*博物馆外部向上遍历文件系统的系统。
terdon

21

要删除目录中的所有文件和目录(包括隐藏的文件和目录),可以尝试以下操作:

  • 用于ls -Ab匹配所有文件/目录

    cd dir_name && rm -rf `ls -Ab`
    
  • 用于find匹配所有文件/目录

    find dir_name -mindepth 1 -delete
    

    或者,如果您find不支持-delete

    find dir_name -mindepth 1 -exec rm -rf {}
    
  • 删除文件夹,然后重新创建

    rm -rf dir_name && mkdir dir_name
    
  • 猛烈地

    shopt -s dotglob  
    rm -rf dir_name/*
    

请注意,rm -rf *如果您不了解目录中的文件,则like这样的命令并不安全,因为以-(连字符)开头的文件将被解释为rm标志...
VasyaNovikov

1
编辑:为了安全起见,请使用rm -rf ./* ./.*
VasyaNovikov

9

要递归删除目录中的所有常规文件,此命令(假设使用GNU或FreeBSD find)就足够了:

find . -type f -delete

这样就留下了所有非常规文件,例如符号链接(无论它们是否指向常规文件),目录,fifos,套接字,设备...

也可以看看:

find . ! -type d -delete

删除目录以外的任何类型的文件



3

我在find这里使用命令:

第1步:找到所有文件并将其删除:

find /path/to/directory/ -type f -exec rm {} \;

例:

find /home/user/Desktop/images/ -type f -exec rm {} \;

步骤2:找到所有子目录并将其删除:

find /path/to/directory/ -type d -exec rm -R {} \;

find /path/to/directory/ -type d包括在内.,将删除目录本身。您还需要使用-mindepth其他人所说的开关。
亚瑟塔卡

3

问题是清空目录=删除目录的内容,包括隐藏文件,但不删除目录本身。使用-mindepth 1的find命令实际上是正确的方法,但是为了避免错误消息,它必须与-maxdepth 1结合使用:

find /path/to/dir -mindepth 1 -maxdepth 1 -exec rm -rf '{}' \;



0

这对我来说非常有效,每次都测试了几种变体。

从包含图像目录的目录。

rm -frd ./images/*

之前:

images/
    |_ header.png
    |_ footer.png
    |_ subdir/

后:

images/

不知道它是明确在原来的问题,而只是指出,除非你能够dotglob,这将跳过下图像的任何“点文件”或点目录(mkdir images/.somedir; touch images/.somefile
杰夫·夏勒

0

要删除当前目录中的所有文件和子目录,包括隐藏的文件和子目录,而不会出现错误消息

rm -rf .[^.] .??* *

或者,从父目录:

rm -rf images/.[^.] images/.??* images/*

https://serverfault.com/a/47940/269538



-2

删除文件夹“ test”和其中的所有文件:

 rm -r test

删除其中的所有文件,但保留文件夹“ test”:

 rm -r test/*

-4

cd进入文件夹,然后执行以下命令:

ls |xargs rm -rf

2
这将对包含空格的文件名失败。我建议不要将ls的输出用作其他命令的输入,这通常是不安全的。
dhag 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.