Bash mv不识别通配符/变量扩展

Bash mv不识别通配符/变量扩展,bash,wildcard,aix,mv,variable-expansion,Bash,Wildcard,Aix,Mv,Variable Expansion,我正在尝试将一系列目录中的所有文件移动到各自文件夹的子目录中。有很多文件夹需要这样做,所以我把它放在一个循环中。为了这个例子,我减少了这个数字 read var1 case ${var1} in a) sub="sub_directory1";; b) sub="sub_directory2";; esac for ((i=1; i<=5; i++)); do case ${i} in 1) t=a;; 2) t=b;; 3) t=c;; 4) t=d;; 5) t=d;

我正在尝试将一系列目录中的所有文件移动到各自文件夹的子目录中。有很多文件夹需要这样做,所以我把它放在一个循环中。为了这个例子,我减少了这个数字

read var1
case ${var1} in a) sub="sub_directory1";; b) sub="sub_directory2";; esac

for ((i=1; i<=5; i++)); do
   case ${i} in
     1) t=a;; 2) t=b;; 3) t=c;; 4) t=d;; 5) t=d;;
   esac
   mv "${location[files]}${t}/*.*" "${location[files]${t}/${sub}
done
诸如此类。想法是
/files/a/
中的文件将移动到
文件/a/sub_目录1

当我在脚本中运行它时,它似乎正确地扩展了变量,但显然不是mv的正确方式。我明白了

mv: cannot rename files/a/*.* /files/a/sub_directory1/*.*:
No such file or direbctory
当我手动执行相同的命令时:

mv /files/a/*.* /files/a/sub_directory1
它按预期工作


通配符是按字面意思处理的吗

双引号在允许变量扩展的同时防止分词和全局搜索,即
“*.*.*.
只是一个字符串。要对文件名执行全局搜索,您可以执行以下操作:

mv "${location[files]}${t}"/*.* "${location[files]}${t}/${sub}"

双引号内的全局不展开。你需要把它们从引文中删掉。对于任何像我这样的未来新加入bash的人来说,Etan的评论解决了我的问题。我在MV命令中将引号移到星号之前。这个脚本背后的动机是什么?@chicks-我在工作中加载文件,这些文件都必须放在一系列具有相同文件结构的特定文件夹中。但我必须确保加载的每个文件夹中只有两个子目录,否则文件会被复制。我总是将它们加载到同一个子目录(*/sub_directory1)。这就是脚本的这个特定部分所处理的。其他部分准备将所有文件扩展名放入各自正确的文件夹中,复制新文件,然后填充这些文件应该放在的字段。@mkingsbu:您可以将更正后的代码作为答案发布,然后在48小时后接受,以给自己更多的声誉分数。祝大家好运。
mv "${location[files]}${t}"/*.* "${location[files]}${t}/${sub}"