【问题标题】:How do you delete all hidden and non-hidden files except one?如何删除除一个之外的所有隐藏和非隐藏文件?
【发布时间】:2021-12-28 10:15:06
【问题描述】:

你如何删除除了 Bash 中的一个之外的所有隐藏和非隐藏文件?

因为我正在创建一个存储库,并且刚刚创建了一个更新脚本。

【问题讨论】:

  • 你的目标是什么?为什么要删除除一个文件之外的所有文件?可能已经有一个工具可以做到这一点。我的猜测是你想删除除.git 之外的所有已知文件。我说的对吗?
  • mv 保存文件 /tmp; rm -r *; mv /tmp/file-to-keep .?
  • @JoshBeauregard 所有文​​件和 git,更新脚本除外,因为我需要它来将下载的源代码更新到较新的版本。

标签: bash git-bash rm


【解决方案1】:

这将删除当前目录中您有权删除的所有内容,递归地保留-path 命名的文件及其父路径。

# Remove all files bar one
find . -mindepth 1 -not -type d -not -path ./file/to/keep -exec rm -rf {} +

# Then remove all empty directories
find . -mindepth 1 -type d -exec rmdir -p {} + 2>/dev/null

`rmdir` will get fed a lot of directories it’s already removed (causing error messages). `rmdir -p` is POSIX. This would not work without `-p`.

您可以使用额外的-path 参数和/或全局模式保留更多文件。路径必须与起点匹配,即./

【讨论】:

    【解决方案2】:

    我会使用 Bash 的 extended globbingdot-globbing 功能:

    shopt -s dotglob extglob
    cd /path/to/clean && rm !(file-name-to-keep)
    

    这可以通过更改到父目录并——如果成功——在扩展通配符上执行rm 命令来工作。该扩展通配符要求 bash 扩展所有文件名(包括以句点开头的文件名,给定 shopt -s dotglob),file-name-to-keep 除外。

    【讨论】:

      【解决方案3】:

      这将删除当前目录中除“file-x”之外的所有文件(不是目录):

      rm `find . -maxdepth 1 -type f | grep -v "^\./file-x\$"`
      

      查找会创建所有文件(包括隐藏文件)的列表。 “grep -v”从该列表中删除“./file-x”行。

      【讨论】:

      • 这会破坏包含空格的文件名。此外,find 可以排除想要的文件:find . -type f -not -name file-x -print0 | xargs -0 echo rm(如果看起来正确,请删除“echo”)
      • 我需要删除除一个文件之外的所有文件和目录。
      猜你喜欢
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 2018-05-23
      • 1970-01-01
      • 2021-11-03
      • 2011-08-23
      相关资源
      最近更新 更多