![从 ubuntu 中的终端删除除一个文件夹之外的所有文件夹和文件](https://linux22.com/image/1488482/%E4%BB%8E%20ubuntu%20%E4%B8%AD%E7%9A%84%E7%BB%88%E7%AB%AF%E5%88%A0%E9%99%A4%E9%99%A4%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B9%8B%E5%A4%96%E7%9A%84%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%E5%A4%B9%E5%92%8C%E6%96%87%E4%BB%B6.png)
我想删除除一个之外的所有文件夹和文件。我有一台 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)
。如果有效请告诉我。