在Bash中如何删除除指定文件外的全部隐藏及非隐藏文件?
Bash保留单个指定文件删除其余所有文件的实现方案
方案1:extglob 扩展匹配(脚本内使用更简洁)
这种方案适合在你自己编写的控制脚本内使用,逻辑清晰易读:
- 先开启必要的shell选项:
shopt -s extglob dotglob
配置说明:
extglob:开启Bash的扩展通配符能力dotglob:让通配符默认匹配.开头的隐藏文件,无需单独处理隐藏文件规则- 执行删除操作,以目标目录为
./repo,要保留的文件为update.sh为例:
rm -rf ./repo/!(update.sh)
- 可选项:执行完成后关闭扩展选项,避免影响后续脚本逻辑:
shopt -u extglob dotglob
方案2:find 命令(兼容性更强)
如果需要跨环境兼容,或者不想修改shell选项,可以用find命令实现:
- 命令示例,同样以保留
./repo/update.sh为例:
find ./repo -mindepth 1 -not -path "./repo/update.sh" -delete
参数说明:
-mindepth 1:避免匹配到目标目录本身,防止误删父目录-not -path "./repo/update.sh":按完整路径排除要保留的文件,规则更精准,如果只要匹配文件名可以替换为-not -name "update.sh"-delete:直接删除匹配到的所有文件和目录
安全提示
正式执行删除前,建议先做预览验证:
方案1可以把rm -rf替换为echo,查看输出的待删除文件列表是否符合预期
方案2可以把-delete替换为
内容的提问来源于stack exchange,提问作者anon824303
相关产品推荐
相关产品推荐

