请教mv命令目标路径通配符失效的简易解决方法
解决mv命令目标路径使用通配符失效的问题
我明白你的问题了——当mv的源路径使用通配符时能正常工作,但把通配符放到目标路径里就失效,这其实是shell通配符展开逻辑和mv命令的工作机制共同导致的:
- 当通配符在源路径时,shell会先把它展开成所有匹配的文件/目录,
mv可以一次性处理多个源文件到一个目标目录; - 但通配符在目标路径时,如果匹配到多个目录,
mv根本不知道该把文件放到哪一个;就算只匹配到一个目录,shell的展开规则也可能因为路径结构(目录/文件名)的嵌套导致解析异常。
这里有几个无需额外复杂工具的简易修复方案:
方案1:先捕获匹配的目录到变量,再执行mv
先把通配符匹配到的目录单独存到变量里,确保只获取到一个目标目录后,再用这个变量拼接完整的目标路径:
# 用数组存储匹配的目录,避免单个变量处理多结果的问题 target_dirs=(/Volumes/Myshare/SourceVideo/$in1*) # 先判断匹配结果是否符合预期 if [ ${#target_dirs[@]} -eq 0 ]; then echo "未找到匹配$in1的目录,跳过处理" >> log.txt continue elif [ ${#target_dirs[@]} -gt 1 ]; then echo "找到多个匹配$in1的目录:${target_dirs[*]},跳过处理" >> log.txt continue fi # 执行mv命令 mv -f /Volumes/Myshare/Processed/$in1.mov "${target_dirs[0]}"/$in1.mov
方案2:用find命令定位目标目录并执行mv
find命令可以精准定位到匹配的目录,然后直接通过-exec参数执行mv,完全绕开shell通配符展开的问题:
# 查找以$in1开头的目录,找到后立即执行mv操作 find /Volumes/Myshare/SourceVideo -type d -name "$in1*" -exec mv -f /Volumes/Myshare/Processed/$in1.mov {}/$in1.mov \;
这个方案的优势是:如果意外出现多个匹配目录,会自动把文件复制到每个匹配目录中(你的场景里应该只会有一个),同时也能处理目录名称里包含特殊字符的情况。
为什么原来的命令不行?
你原来的目标路径写法Volumes/Myshare/SourceVideo/$in1*/$in1.mov(注意漏写了开头的/),shell会先尝试展开$in1*部分:
- 如果匹配到多个目录,shell会把它展开成多个完整路径,比如
Volumes/Myshare/SourceVideo/abcdefg_20180525/$in1.mov Volumes/Myshare/SourceVideo/abcdefg_20180526/$in1.mov,这时候mv会收到多个目标参数,直接报错; - 就算只匹配到一个目录,也可能因为路径解析顺序的问题,导致
mv无法识别完整的目标路径。
内容的提问来源于stack exchange,提问作者user9849399
相关产品推荐
相关产品推荐

