如何删除目录中除文件和目录列表之外的所有内容?
Posted
技术标签:
【中文标题】如何删除目录中除文件和目录列表之外的所有内容?【英文标题】:how to remove everything inside directory except a list of files and directories? 【发布时间】:2022-01-22 09:11:24 【问题描述】:我需要删除 dist/
文件夹中的所有内容,manifest.json
和 index.html
和 assets/
除外。它将在package.json
中作为脚本运行。
我尝试用 find 解决它
"clean": "find dist ! -name manifest.json -type f -delete | find . -type d -empty -delete"
但我无法让它与多个参数一起使用。
编辑:
所以我想保留:
dist/assets/*
资产中的所有内容。包括像dist/assets/map/dog.ts
这样的子目录
dist/manifest.json
dist/index.html
并删除其余部分,例如:
dist/pages/
删除目录、子目录和文件dist/examples/
删除目录、子目录和文件dist/randomfile.txt
删除文件dist/hello.js
删除文件dist/*
等
【问题讨论】:
您的要求不完全清楚。请edit您的问题并添加更多详细信息。您想将命名文件和目录仅保留在dist/
中还是保留在它的任何子目录中?根据您的find
命令,我假设您想删除删除文件和子目录后为空的目录,对吧?
@Bodo 对不起。我更新了问题。如果需要更多说明,请告诉我。
【参考方案1】:
根据你要保留的问题的current version
dist/assets/
(以及里面的所有东西)
dist/manifest.json
dist/index.html
并删除 dist
中的所有其他内容。
为了测试,我使用了这个find
命令。
find dist -mindepth 1 -maxdepth 1 \
-type f \( -name manifest.json -o -name index.html -o -print \) -o \
-type d \( -name assets -o -print \)
如果输出列出了应该在dist
中删除的所有内容,您可以运行实际删除数据的版本。
find dist -mindepth 1 -maxdepth 1 \
-type f \( -name manifest.json -o -name index.html -o -print -delete \) -o \
-type d \( -name assets -o -print -exec rm -rf "" \; \)
解释:
全局选项-mindepth 1 -maxdepth 1
将搜索限制在dist
正下方的所有文件和目录。
-type f \( actions1 \) -o -type d \( actions2 \)
使用 AND (-a
or nothing) 和 OR (-o
) 操作对文件执行actions1
,对目录执行actions2
,使用转义括号,因为 AND 操作的优先级高于 OR。 (如果dist
中有任何其他对象(例如符号链接、命名管道等),您可能需要添加条件和一些操作来捕获其他情况。
-name manifest.json -o -name index.html -o -print -delete
OR 操作:如果第一个表达式(匹配名称)之一为真,则不执行最后一个(-print -delete
)
-name assets -o -print -exec rm -rf "" \;
与上面类似,使用rm -rf
进行递归删除,因为-delete
不会删除非空目录。
替代解决方案:
重命名dist
创建一个新的dist
将要保留的文件和目录移动到新的dist
递归删除旧的重命名目录。
mv dist dist.tmp && mkdir dist &&
mv dist.tmp/assets dist.tmp/manifest.json dist.tmp/index.html dist &&
rm -rf dist.tmp
【讨论】:
以上是关于如何删除目录中除文件和目录列表之外的所有内容?的主要内容,如果未能解决你的问题,请参考以下文章
如何删除 Core Data 存储中除一个对象之外的所有对象?