从 ubuntu 中的终端删除除一个文件夹之外的所有文件夹和文件

从 ubuntu 中的终端删除除一个文件夹之外的所有文件夹和文件

我想删除除一个之外的所有文件夹和文件。我有一台 Ubuntu 服务器,我尝试了几种方法,但都不起作用。

这是我的文件夹结构。

app
app/public
app/public/uploads
app/public/css
app/models
file.txt

我想保留app/public/uploads并删除所有其他文件和文件夹。

这些是我尝试过的方法:

find . -maxdepth 1 ! -name 'public/uploads' ! -name '.*' | xargs rm -rf

find . ! -name 'public/uploads' -type f -exec rm -f {} +

答案1

我今天实际上想实现类似的行为。我正在为使用 DocFx 编写的 C# 库连接文档,文件是在_site文件夹中生成的。

现在,就我的特定情况而言,我需要两件事,a)在文件夹内有一个 git 存储库_site,b)每次构建后,我都想删除_site文件夹内的所有内容,除了.git文件夹及其所有内容。

为了模拟该行为,我们来看看以下结构:

在此处输入图片描述

目标是删除除.git/**

因此,首先我要做的是编写一个find .命令并查看我得到了什么:

在此处输入图片描述

然后我写下find . -mindepth 1 -not -regex "^\./\.git.*"排除该.git文件夹及其所有内容:

在此处输入图片描述

现在我对结果很满意,我所要做的就是将标志传递-delete给我的 find 命令,结果如下find . -mindepth 1 -not -regex "^\./\.git.*" -delete

在此处输入图片描述

如果你的find命令不支持-delete标志,那么你可以使用以下方法获得相同的结果find . -mindepth 1 -not -regex "^\./\.git.*" -print0 | xargs -0 -I {} rm -rf {}

Be warned, don't use `-delete` or `-print0 | xargs -0 -I {} rm -rf {}` 
if you first don't verify that the output you are getting from `find` command
matches your expectations, otherwise, you will lose data.

但就我的情况而言,我想在文件夹外运行命令_site;因此,我的最终命令如下所示:

find ./_site -mindepth 1 -not -regex "^\.\/_site\/\.git.*" -delete

这也可以起作用:find ./_site -mindepth 1 -not -regex "^.*\/.git.*" -delete,但它也会保留.git您想要清理的文件夹的任何子文件夹中可能拥有的任何文件夹。

我希望它有帮助!

干杯!

答案2

您可以使用命令执行此操作rm -r !(app/public/uploads)。如果有效请告诉我。

来源:

相关内容