如何删除目录中除文件和目录列表之外的所有内容?

Posted

技术标签:

【中文标题】如何删除目录中除文件和目录列表之外的所有内容?【英文标题】:how to remove everything inside directory except a list of files and directories? 【发布时间】:2022-01-22 09:11:24 【问题描述】:

我需要删除 dist/ 文件夹中的所有内容,manifest.jsonindex.htmlassets/ 除外。它将在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.jsondist/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

【讨论】:

以上是关于如何删除目录中除文件和目录列表之外的所有内容?的主要内容,如果未能解决你的问题,请参考以下文章

删除 VIM 中除第一列之外的所有内容

删除 bash 脚本中除了最新的 3 个文件之外的所有文件

如何删除 Core Data 存储中除一个对象之外的所有对象?

关闭 Emacs 中除当前缓冲区之外的所有缓冲区

通过 httpd.conf / htaccess 重定向目录中除一个文件之外的所有文件

如何删除 Firebase 节点中除最近的 X 子节点之外的所有子节点?