87

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

  • 不是目录
  • 不是子目录
  • 不是这些子目录中的文件。

有些文件没有扩展名,所以rm *.*不会工作......

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

有什么建议吗?

4

10 回答 10

78
find PATH -maxdepth 1 -type f -delete

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

于 2012-08-05T23:56:53.720 回答
69

您只能将findwith-type f用于文件,-maxdepth 1因此find不会搜索/path/to/directory. rm -i将在每次删除时提示您,以便您确认或拒绝删除。如果您不关心每次删除都被要求确认,请将其更改为(rm -fv强制删除)。该标志使得每次删除时都会打印一条消息,说明刚刚删除的文件。-f-v

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

这应该符合以下标准:

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

于 2011-10-10T15:16:15.017 回答
24

由于这在谷歌搜索中很高,最简单的答案是:

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。它是唯一与模式匹配的。

只是一个清理 cakephp tmp-directory 并保持目录结构完整的 Makefile 示例:

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

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

让我知道您是否有一个可以做其他事情的系统(BSD?)。

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

于 2013-03-23T12:52:26.873 回答
9

rm默认情况下不会删除目录。因此,在您的示例中,假设您在父目录中并且这些都是文件,您只需要:

rm *
于 2016-09-08T09:13:00.150 回答
7

TL;博士:

find . -maxdepth 1 -type f -delete

ETC:

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

find . -type f -maxdepth 1 -delete

查找:警告:您在非选项参数 -type 之后指定了 -maxdepth 选项,但选项不是位置性的(-maxdepth 影响在它之前指定的测试以及在它之后指定的测试)。请在其他参数之前指定选项。

于 2017-03-09T23:31:32.747 回答
6

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

于 2012-01-27T18:15:17.400 回答
5

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

于 2011-10-10T16:57:34.120 回答
1

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

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

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

于 2014-12-22T21:19:47.573 回答
-1

对我有用的是 PERL 脚本:

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

从您要清理的目录向上运行这一层:将“subdirectory_name”替换为目录名称。

在不占用 CPU 的情况下处理数百万个文件。

于 2013-07-20T21:00:29.577 回答
-1

以下两条命令将递归删除当前目录下的所有文件和符号链接:

find . -type f -delete
find . -type l -delete

作为一个命令,以下工作:find . -type f -delete&&find . -type l -delete

于 2021-11-14T06:32:08.780 回答