递归删除与名称匹配的文件夹中的所有文件的命令是什么?

我有一个基础文件夹(我们称之为base)。

我有很多子文件夹,散落在不同的深度中,这些子文件夹中还有缓存文件夹。

我想删除缓存文件夹中的所有文件,但不删除文件夹本身。

我已经尝试过

cd base
#then one of...
sudo rm -rf cache/*
sudo rm -rf *cache/*
sudo rm -rf cache*/*
sudo rm -rf *cache*/*

但实际上我只是在猜测,什么才是正确的命令?

有人给这个点了踩,却没有留下任何评论? - Hailwood
它可能因为更多与一般脚本编写相关而被下投票,而不是与Ubuntu有关。应该去StackOverflow上提问。 - amanthethy
4个回答

在bash中,您可以启用globstar并使用**递归地匹配目录
shopt -s globstar
echo rm -rf ./**/*cache*/*

查看模式匹配

这将递归删除名为cache的文件夹中的所有文件,从base文件夹开始。这些cache文件夹本身将保持完好,但其中的所有文件将被删除。
find base -ipath "*/cache/*" -type f -delete

你可以使用非常强大的find命令。
我会用类似这样的方式:
find . -iname *cache* -ok rm -rf {} \;

现在让我为您解释一下。Find是该应用程序的名称,它有很多选项,但对于您来说,您不需要其中很多。

.表示在当前目录中查找。这意味着您必须先进入正确的目录。我假设对于您来说,那就是~

-iname表示按照不区分大小写的名称进行搜索。

*cache*表示名称必须包含cache。

接下来的部分很重要。

-ok表示执行后面的命令,但会先询问我是否要执行。这可以替换为-exec,但我不建议这样做。那样会删除文件而不告诉您,您不想要那样。

好的,下一行(也就是-ok运行的内容)是rm -rf {} \;

rm -rf我希望是不言自明的。 {}基本上是该命令找到的文件名称的占位符。末尾的\;表示行的结束。

希望这样讲清楚了。

我建议运行不包括-ok及其右侧的所有内容的查找命令。它会首先列出所有缓存文件的列表,您可以进行审查。然后再添加-ok部分并开始操作!

你忘记引用-iname的模式,如果当前目录中恰好有与该模式匹配的文件,那么这将导致错误。此外,这种方法还会删除缓存目录,而不仅仅是其中的内容。 - geirha
这将删除所有名为cache的文件夹,包括其中的文件。OP想要删除名为cache的文件夹中的文件,而不是删除文件夹本身。 - Flint

只需将basedir替换为您想要删除的基目录的路径

$ find basedir -type f -delete

如果你觉得在进入基础目录之前移动更舒适,那么:
$ cd basedir
$ find . -type f -delete