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


289

我最接近的是

# rm /path/to/directory/*.*

但这不适用于没有扩展名的文件...

Answers:


340

Linux不使用扩展名。由文件的创建者决定他是否希望名称具有扩展名。Linux查看第一个字节来确定它正在处理哪种文件。

要删除目录中的所有内容,请使用:

rm /path/to/directory/*

您可以使用该-r选项,例如:

rm -r /path/to/directory/*

还可以删除要删除其内容的目录内的所有子目录(及其所有内容)。否则,它将显示错误消息,通知您未删除目录。


13
如果您还想删除隐藏的文件,请在运行shopt -s dotglob之前运行rm (...)
danjjl 2011年

7
*表示all files;)*.*表示.名称中包含某个位置的所有文件
Rinzwind 2011年

10
@Rinzwind,更准确地说,星号表示“零个或多个字符”。因此*a*意味着零个或多个字符,a然后是零个或多个字符。这将匹配文件名happyappleala
DisgruntledGoat

7
@ user784637您太容易留下深刻的印象
barlop 2014年

1
这是您想要的命令:
rm-

168
  • 删除文件夹及其所有内容(包括所有内部文件夹):

    rm -rf /path/to/directory
    
  • 要删除文件夹的所有内容包括所有内部文件夹)但不删除文件夹本身:

    rm -rf /path/to/directory/*
    

    要么

    rm -rf /path/to/directory/{*,.*}
    

    如果要确保还删除了隐藏的文件/目录。

  • 要从文件夹内部删除所有“文件”(删除内部文件夹):

    rm -f /path/to/directory/{*,.*}
    


  • 警告:如果路径中有空格,请确保始终使用引号。

    rm -rf /path/to the/directory/*
    

    等效于2个单独的rm -rf调用:

    rm -rf /path/to
    rm -rf the/directory/*
    

    为避免此问题,可以使用'单引号'不扩展外壳变量)或"双引号"扩展外壳变量):

    rm -rf "/path/to the/directory/"*
    


哪里:

  • rm-代表“ 删除
  • -f-代表“ force ”,例如,当您不想询问/提示是否要删除档案时,这很有用。
  • -r-代表“ 递归 ”,这意味着您要递归浏览每个文件夹并删除所有内容。

8
除了标记为“已接受”的答案之外,我发现这是更全面,更有用的答案。
启发

2
rm -rf /path/to/directory/*不会删除文件夹中的隐藏文件,例如.htaccess。也许rm -rf /path/to/directory/.吧?还没试过
马克·贝里

@MarkBerry rm -rf /path/to/directory/.*
Lilian A. Moraru

@ LilianA.Moraru,我今天做了一些测试。rm -rf /path/to/directory/.*仅删除指定目录中的隐藏文件。查看@danjjl对@Rinzwind答案的评论,以删除隐藏文件,然后shopt -s dotglob再运行rm -rf /path/to/directory/*
马克·贝里

注意: rm -rf /path/to/directory/.*在我的系统上,导致中的项目删除/path/to。幸运的是,我刚刚将全部数据备份到了单独的磁盘上。不用说,rm -rf /path/to/directory/.*除非您已将整个计算机备份到单独的/安全的位置,否则不要发出命令!
法律名单

43

要删除目录中的所有文件(包括隐藏文件和子目录),请运行:

rm -rf /path/to/directory/{*,.*}

1
这应该是接受的美丽答案。谢谢!
Nam G VU

3
这个glob是否不匹配“。” 和“ ..”呢?
hertzsprung

4
@hertzsprung-确实如此,它会警告您它不能删除./../,但仍会删除隐藏的文件。
Ryan Wheale '17

这在Mac控制台上不起作用,隐藏的文件仍在该命令行中。
agapitocandemor

删除当前目录中的所有内容:rm -r $(pwd)/{*,.*}
Jimmy Adaro

10

如果您只想删除/ path / to /目录中的文件,则可以执行

find /path/to/directory -type f -print0| xargs -0 rm 

要么

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

您可以使用进行加载find,优点是您可以列出找到的内容,而无需通过管道将其发送到,rm因此您可以查看在开始之前要删除的内容。


2
GNU find作为-delete谓词。如果您仍要使用-exec,则替换\;+会将rm呼叫收集在一起,从而提高效率。
enzotib 2011年

1
带有'+'的大量文件会导致问题,因为列表太大,与rm -f *相同。从同一个文件夹中删除大量文件时(以毫秒为单位),这两个都不好:)最后,C ++出现了,并按照目录树中inode的顺序删除了文件。
Osis

3
您确实应该在RM之后添加-。否则,如果您有文件名,则-rf或类似名称将被解释为rm的参数。例如xargs -0 rm-或-exec rm-{} \;
Richm 2011年

您还可以为xargs提供-n参数。这将导致它到RM命令被划分到具有的参数的最大数量,即“-n 100 -0 RM xargs的- ”将在100块中删除文件
Richm

1
您还可以添加-maxdepth 1以确保find不返回任何子目录中的文件。即找到/ path / to / directory -maxdepth 1 -type f
Richm

7

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

  • 删除文件夹,然后重新创建

    rm -rf dir_name && mkdir dir_name
    
  • 采用 find

    find dir_name -mindepth 1 -delete  
    

在这里,我们指定-mindepth 1排除目录dir_name本身。
看一下以下链接:https :
//unix.stackexchange.com/questions/12593/how-to-remove-all-the-files-in-a-directory


感谢您的建议,我为链接添加了更多说明。
zeekvfu

3
请小心,因为删除和重新创建文件夹可能会导致此文件夹的权限不同/错误!
einjohn

6

如果您还想删除所有子目录和目录本身,则可以使用rm -rf /path/to/directory。但是请务必在按回车键之前仔细检查您的行,这rm -rf也会引起很多麻烦,例如,如果您在具有超级用户权限的情况下不小心在第一个斜杠后插入空格...


1

由于当我自己搜索此问题时,该问题一直是Google的首要问题:

其他答案有不同的问题:

  1. 其中一些包括...它是嘈杂,混乱,烦人。

  2. 其中一些忘记了隐藏文件(以点开头的文件)。

  3. 它们不会以正确的顺序(最深优先)删除,以允许目录删除。

  4. 它们属于其他(挂载)文件系统,这通常是不希望的。

  5. 使用额外的参数很难对其进行适当的扩展(更多内容请参见下文)。

因此,要递归删除目录中的所有文件和文件夹,请执行以下操作:

find "${DIR}" -xdev -mindepth 1 -printf "%d\t%y\t%p\0" | sort -z -r -n | cut -z -f3- | xargs -0 -r -- rm -d --

请注意,我添加了一个-xdev参数以防止下降到坐骑(如/procetc.)。

为什么不-depth-delete

尽管人们一直对此表示不满,但是这些方法也有缺点:它们似乎没有足够的可扩展性以允许-prune子目录(而不会引入更多问题)。与这种方法相比,您可以插入

-not \( -path "${DIR}/subdir" -prune \)

-mindepth排除要subdir删除其内容的参数之前。


对于深度优先,则有一个-depth标记find
Sergiy Kolodyazhnyy

呃...为什么不只-delete和with一起find使用?-delete是深度优先。你已经假定非POSIX find-printf,所以你还不如用-delete-depth -print0 | xargs -0 rm
穆鲁

@muru:因为我不知道...我会改变它。
Mehrdad '18

@muru:实际上,看来您的方法不适用-not \( -path "$DIR/subdir" \)...但我的方法适用吗?为什么?
Mehrdad '18年

@Mehrdad那应该怎么办?
muru

0

记住,您可以cd进入目录,然后rm *.*像在DOS中一样运行命令。


1
DOS是用于文件的DEL,而RMDIR是用于清空的目录-隐藏和隐藏文件,并且系统文件必须首先删除那些ATTRIB属性。不太简单;)
埃里克(Eric

0

要删除当前目录,您可以例如使用 rm -d ./*

-d指示删除目录。

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.