mv命令无法识别通配符/变量扩展

3

我正在尝试将一系列目录中的所有文件移动到各自文件夹的子目录中。有许多需要这样做的文件夹,所以我已经将它放在了循环中。为了举例说明,我已经减少了数量。

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

${location[files]}${t}${sub}都是目录,因此结构看起来类似于这样:

/files/a/file1.txt
/files/a/file2.txt
/files/a/sub_directory1
/files/a/sub_directory2
/files/b/file33.txt.3824
/files/b/file52f.log.345
/files/b/sub_directory1
/files/b/sub_directory2

等等,这里需要进行翻译!

需要移动/files/a/文件夹中的文件到files/a/sub_directory1中。这个思路就是这样。

当我在脚本中运行时,变量被正确地扩展了,但显然对于mv命令来说并不正确。我收到了如下错误提示:

mv: cannot rename files/a/*.* /files/a/sub_directory1/*.*:
No such file or direbctory

当我手动执行相同的命令时:
mv /files/a/*.* /files/a/sub_directory1

它按照预期工作。

是通配符被当做字面意思处理了吗?


3
在双引号内,通配符不会被扩展,你需要将它们排除在引号之外。 - Etan Reisner
对于像我这样的新手,以后可能会阅读Etan的评论解决了我的问题。我将引号移到MV命令中的星号之前。 - mkingsbu
这个脚本的动机是什么? - chicks
1
@chicks - 我在工作中加载文件,这些文件都必须放在具有相同文件结构的一系列特定文件夹中。但我必须确保我从每个文件夹中加载的文件只有两个子目录,否则文件会重复。我总是将它们加载到相同的子目录(*/sub_directory1)中。这就是脚本的这个特定部分处理的内容。其他部分准备所有文件扩展名进入其正确的各自文件夹,复制新文件,然后填充它们应该去的字段。 - mkingsbu
1
@mkingsbu:你可以将你的修改后的代码发布为答案,然后在48小时后接受它,以获得更多的声望分。祝大家好运。 - shellter
1个回答

2
双引号可以防止单词分割和通配符扩展,同时允许变量扩展。例如,"*.*" 就是字符串字面上的 *.*。想在文件名中使用通配符,你可以这样做:
mv "${location[files]}${t}"/*.* "${location[files]}${t}/${sub}"

More info on Bash manual.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接