如何将文件夹全部内容移动到其内部子文件夹且排除目标子目录
可以排除,以下是具体原因说明和实现方案:
报错原因
你执行的命令中xyz/*会匹配xyz目录下的所有一级文件和文件夹,也包括目标目录xyz/archive本身,因此mv操作会尝试将archive目录移动到其自身的子目录中,触发系统的非法操作报错。
通配符排除archive的实现方法
方法1:使用Bash扩展通配符(最便捷)
Bash支持扩展通配符规则,可直接实现排除匹配:
- 先执行
shopt -s extglob开启扩展通配符功能(绝大多数Linux发行版、MacOS默认已开启该配置,可省略这一步) - 执行移动命令:
mv xyz/!(archive) xyz/archive/
其中!(archive)就是通配符的排除语法,代表匹配除了名为archive的内容之外的所有一级文件/文件夹。
注意:默认通配符
*不会匹配以.开头的隐藏文件,如果需要同时移动隐藏文件,可将命令调整为mv xyz/!(archive) xyz/.(!) xyz/archive/。
方法2:使用find命令(兼容性更强)
如果你的shell环境不支持扩展通配符,可使用find命令完成筛选移动,不需要依赖特定shell规则:find xyz -maxdepth 1 -not -name archive -not -path xyz -exec mv {} xyz/archive/ \;
参数说明:
-maxdepth 1限定只检索xyz目录的一级内容,不遍历深层子目录-not -name archive排除名为archive的目标目录-not -path xyz排除xyz目录本身,避免被匹配到
内容的提问来源于stack exchange,提问作者DevWL
相关产品推荐
相关产品推荐

