仅删除Linux目录中目录中的文件


73

可以运行什么delete命令以仅删除给定目录中的文件

  • 非目录
  • 不是子目录
  • 在这些子目录中没有文件。

某些文件没有扩展名,因此rm *.*无法正常工作...

此文件夹中有数千个文件。

有什么建议吗?


5
什么是“文件夹”?奇怪的是,您在同一问题中同时使用了“目录”和“文件夹”。坚持使用“目录” ...这是正确的术语。
威廉·珀塞尔

1
您找到此AndrewC的答案了吗?
chown

Answers:


66

您只能将findwith-type f用于文件,-maxdepth 1因此find不会在的子目录中搜索文件/path/to/directoryrm -i会在每次删除时提示您,以便您确认或拒绝删除。如果您不希望被要求确认每个删除,请将其更改为rm -fv-f强制删除)。该-v标志可以使每次删除都显示一条消息,说明刚刚删除了哪个文件。

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

这应符合以下条件:

NOT目录
NOT子目录
NOT这些子目录中的文件。


2
值得一提的是,这还将删除所有子目录中的文件,而不仅仅是当前目录。
斯塔文,2011年

1
@staven这不会工作,那么,只希望直接将文件的指定目录下被删除..
AndrewC

1
我永远无法让exec做我想做的事,所以我让循环变得明确: for r in $(find /path/to/directory -type f -maxdepth 1);do rm -v $r;done
Robert Calhoun

1
@Staven不,由于-maxdepth 1,它不会从子目录中删除文件。–
kovacsbv

59
find PATH -maxdepth 1 -type f -delete

但是这不会提示您进行确认或输出刚刚删除的内容。因此最好先不使用-delete操作就运行它,并检查它们是否是正确的文件。


4
这是我最喜欢的解决方案,因为它是一个命令。它不调用-exec的事实对我也是一个加分,因为这不必要地需要了解两个不同的命令。海事组织,这应该是公认的答案。
InfernalRapture

6
在某些版本中,这会引发警告,最好将参数转过来,例如:find / path / to / file -maxdepth 1 -type f
Max

到2020年,我发现有一个-delete参数-比-1xargs简单得多。上以及[这个版本] OS X,作品find是一些* IX分布之间烦人不同。
user2864740

21

由于这是Google搜索的重点,因此最简单的答案是:

rm $directoryPath/*

其中$ directoryPath是您要清空的目录。应归功于cbm3384(出于某种原因,该答案获得了否定票,为什么?)

如果您不想确认:

rm -f $directoryPath/*

如果您不相信尝试man rm

mkdir -p 1/2/3; echo 'hello1' > 1/hello1.txt; echo 'hello2' > 1/2/hello2.txt;echo 'hello3' > 1/2/3/hello3.txt
rm 1/2/*

上面创建了一个目录结构,在每个文件夹中都有“ helloX.txt”(X是目录级别)。rm 1/2/*删除hello2.txt并保留其他结构不变。

rm */*/*仅删除hello2.txt。这是唯一与模式匹配的。

只是一个makefile的示例,它清除cakephp tmp-directory并保留目录结构不变:

clean:
    -rm -f tmp/*
    -rm -f tmp/*/*
    -rm -f tmp/*/*/*
    -rm -f tmp/*/*/*/*

前面的减号rm表示“不停止错误”(未删除的目录返回错误)。如果要保存某个级别,只需删除该行,例如第二条rm行将删除日志。

让我知道您是否有执行其他操作的系统(BSD?)。

编辑:我在ubuntu 12.04,osx lion和sourceforge.net外壳上对此进行了测试。所有的行为都像上面的解释。


1
问题在于,这会创建标准错误,我们在shell脚本中不需要。
zachaysan,2015年

@zachaysan是的,如果您希望保持沉默,请将stderr重定向到其他地方:rm -r $path/* 2> /dev/null在任何情况下您都是对的,这会引发错误,并且抑制所有错误通常是不好的编程。如果将退出状态修改为0(成功),则同样适用。
Juha 2015年

如何删除隐藏文件?例如,.htaccess不会删除名为的文件。嗯,这个答案对我有所帮助。
Pathros

9

rm默认情况下不会删除目录。因此,在您的示例中,假设您位于父目录中,并且所有文件都在其中,那么您所需要做的就是:

rm *

2
如果您不想看到错误提示它无法删除目录,请执行rm * 2> /dev/null
SALEH

7

TL; DR:

find . -maxdepth 1 -type f -delete

等等:

没什么大不了,但是上面的建议对我不起作用,因为...

find . -type f -maxdepth 1 -delete

发现:警告:您已经在非选项参数-type之后指定了-maxdepth选项,但是选项不是位置性的(-maxdepth影响在其之前和之后指定的测试)。请在其他参数之前指定选项。


5

rm dirname/*?没有-f它就不会强行删除,没有-r它就不会递归删除目录以及文件。


rm -f *没有不会删除目录-r。它只是忽略空目录,不要求确认。rm -rf *也删除目录。
Juha 2013年

我运行后rm -r dirname/,它确实删除了顶层目录以及所有子目录和文件,而没有任何提示。我尝试过rm -r dirname/*(带有星号),并且删除了所有子目录和文件,但保留了顶层目录。结论:如果指定,则rmno-f 删除目录-r
马克·贝里

@MarkBerry可能取决于外壳程序和/或操作系统,几年前对我而言不是,并且我没有设置任何默认的RM标志。
戴夫牛顿

@DaveNewton,如果可以的话,很高兴知道您是否仍然得到相同的结果。至少,人们需要知道它可能不是通用的,因此应该首先进行测试。
马克·贝里2014年

2
@Juha这可能就是为什么某些系统的默认设置是添加该-i选项的原因。如果我被禁止使用-r,我会很不高兴,我经常使用它,而不会发生意外。我大部分时间都在命令行上,并且缺少将文件移动而不是删除文件的命令是唯一可以接受的解决方案。即使那样,也需要“最终”删除它们。
戴夫牛顿

5

rm -f dirname/*将仅删除文件,而不提示您输入每个文件。它还将为"Cannnot remove 'subdirname': Is a directory"每个子目录显示。


谢了,兄弟。我认为这是最简单的解决方案。赞成。
Amanullah Aman

我更喜欢这个答案。它删除目录中的所有文件,而不删除子目录。
StefanBob

1

为此,我将使用最大深度为1的find,然后对文件列表执行rm。

find ./dir -maxdepth 1 -type f -exec rm -rf '{}' \;

编辑:这基本上与詹姆斯发布的内容相同,但直到之后我才看到他的发布内容


0

可以使用以下命令

rm -r 'path/of/the/folder/'
mkdir 'path/of/the/folder/'

-2

对我有用的是PERL脚本:

perl -e 'chdir "subdirectory_name" or die; opendir D, "."; while ($n = readdir D) { unlink $n }'

从要清除的目录中向上运行此级别:用目录名称替换“ subdirectory_name”。

在不破坏CPU的情况下处理了数百万个文件。

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.