bash -c执行rm -rf !(a)报错及失效问题求助
问题原因与解决办法
核心原因
- 直接执行
rm -rf !(a)时,当前Shell的extglob(扩展通配符)功能处于开启状态,!(a)会被正确解析为“除了a之外的所有文件”。 - 使用
bash -c "rm -rf !(a)"时,双引号内的!(a)会被当前Shell优先解析,若当前Shell未开启extglob,就会触发语法错误。 - 转义为
bash -c "rm -rf \!(a)"后,虽避免了当前Shell的解析,但子Shell默认关闭extglob,此时!(a)会被当作普通文件名而非通配符,rm找不到对应文件,导致命令不生效。
可行解决方案
方案1:在子Shell中手动开启extglob
将开启扩展通配符的命令与删除命令放在同一bash -c参数内:bash -c "shopt -s extglob; rm -rf !(a)"或用单引号避免当前Shell干扰:
bash -c 'shopt -s extglob; rm -rf !(a)'方案2:换用无需extglob的写法
若不想依赖extglob,可通过基础通配符或find命令实现相同效果:# 针对已知文件名b、c的场景 bash -c "rm -rf b c" # 通用写法,用find匹配除a外的文件 bash -c "find . -maxdepth 1 -type f ! -name 'a' -delete"
内容的提问来源于stack exchange,提问作者Yayong Duan
相关产品推荐
相关产品推荐

