Google Colab中shell执行rm排除文件夹命令报括号语法错误
问题根因
这不是Colab的bug。你使用的!(pattern1|pattern2)通配语法是Bash的extglob(扩展通配符)特性,本地Ubuntu的交互式Shell默认会开启该特性,但Colab中通过!、%%bash、%shell调用的是非交互式Bash进程,默认不会加载extglob配置,因此解析到括号时会直接抛出语法错误。
可行解决方法
方法1:显式开启extglob后执行原命令,和你本地的执行逻辑完全一致
直接在Colab单元格执行以下命令即可,通过-O extglob参数给Bash手动开启扩展通配符开关:!bash -O extglob -c 'rm -r folder/!("folder11"|"folder12"|"folder13")'方法2:使用find命令实现排除删除,不依赖Shell特性,兼容性更强
该写法不需要调整Bash配置,通过find的原生规则匹配目标文件夹,逻辑更可控:!find folder -mindepth 1 -maxdepth 1 -type d \ ! -name "folder11" \ ! -name "folder12" \ ! -name "folder13" \ -exec rm -r {} +参数说明:
-mindepth 1 -maxdepth 1:仅匹配folder目录下的直接子项,不会递归进入子目录遍历-type d:仅匹配文件夹类型的条目- 连续的
! -name规则:声明需要排除、不做处理的文件夹名称 -exec rm -r {} +:将所有匹配到的条目批量传入删除命令
注意:执行删除操作前,建议先把命令里的
rm -r替换成ls执行,预览匹配到的待删除列表,确认匹配规则无误后再执行删除,避免误删重要文件。
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

