标准的 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 即可。
安全小贴士
在执行这类带有“排除”逻辑的删除命令前,强烈建议先将 rm 替换为 ls 预览一下结果:
- 先跑:
ls !(target.txt) - 确认没问题了再跑:
rm !(target.txt)
还有一个非常“手动”但直观的方法:利用反引号 (Backticks)。
rm `ls | grep -v "keep_me"`
原理: grep -v 会过滤掉包含关键字的行。这条命令会先把不含 “keep_me” 的文件列出来,然后传给 rm。