【问题标题】:mv not Recognizing Wildcards/Variable Expansionmv 不识别通配符/变量扩展
【发布时间】:2015-10-04 23:33:40
【问题描述】:

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

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

它按预期工作。

通配符是否按字面意思处理?

【问题讨论】:

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

标签: bash wildcard aix mv variable-expansion


【解决方案1】:

双引号可防止单词拆分和通配,同时允许变量扩展,即"*.*" 只是字面意义上的*.* 字符串。要对文件名进行 globbing,您可以这样做:

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

More info on Bash manual.

【讨论】:

    猜你喜欢
    • 2014-03-31
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    相关资源
    最近更新 更多