不支持--exclude的替代bash操作(删除或其他)

标准的 rm 命令并不支持 --exclude 参数。

如果你在 Linux 或 macOS 的终端直接输入 rm * --exclude="file.txt",系统会报错或者误将 --exclude 当作一个它不认识的选项(或文件名)。

不过,这不代表你做不到“删除全部但排除特定文件”。通常我们会用以下几种更聪明的方法来实现:


1. 使用 Bash 的扩展通配符(最推荐)

在 Bash 中,你可以开启 extglob 功能,这样就能使用类似“排除”的语法。

  • 开启方式: shopt -s extglob
  • 使用命令: rm !(filename.txt)
  • 排除多个: rm !(file1.txt|file2.txt|folder1)

注意: ! 表示“非”,这条命令的意思是删除所有不在括号内的文件。


2. 使用 find 命令(最稳妥)

如果你需要更精细的控制(比如按后缀排除或跨目录),find 是工业级的选择。

find . -maxdepth 1 -not -name "keep_me.txt" -delete

  • .:当前目录。
  • -maxdepth 1:只处理当前层级,不进入子目录(防止误杀)。
  • -not -name:排除匹配该名称的文件。
  • -delete:执行删除操作。

3. 使用 rsync 的“黑科技”

这是一种比较另类但极快的方法。通过将一个空目录同步到一个目标目录,并利用 rsync 的排除功能来变相删除。

rsync -a --delete --exclude 'important.txt' /path/to/empty_dir/ /path/to/target_dir/


4. 交互式删除(最原始但安全)

如果你只是想在删除时人工确认一下,可以使用 -i 参数:

rm -i *

系统会逐个询问 y/n,遇到想留下的输入 n 即可。


:light_bulb: 安全小贴士

在执行这类带有“排除”逻辑的删除命令前,强烈建议先将 rm 替换为 ls 预览一下结果:

  • 先跑:ls !(target.txt)
  • 确认没问题了再跑:rm !(target.txt)

还有一个非常“手动”但直观的方法:利用反引号 (Backticks)。

rm `ls | grep -v "keep_me"`

原理: grep -v 会过滤掉包含关键字的行。这条命令会先把不含 “keep_me” 的文件列出来,然后传给 rm。