不能将$ myvar _。*用于以$ myvar_开头的mv文件

时间:2016-06-21 13:39:14

标签: bash mv

week=$(date +%W)

我尝试使用$week将以mv开头的文件移动到另一个文件夹。

所以我有一个名为:

的文件
25_myfile.zip

开头的数字是一周的数字。所以我想使用mv从目前所在的目录/mydir/week25/移动它:

mv /mydir/$week\_.* /mydir/week$week;

但我收到了统计错误。

2 个答案:

答案 0 :(得分:4)

问题

当你说

mv /mydir/$week\_.* /mydir/week$week;
#                ^^

您正在使用语法$var\_.*(或${var}_.*如果您不想逃避下划线)您尝试使用通配符,但因为使用正则表达式而失败语法。

解决方案

按照Bash Reference Manual → 3.5.8 Filename Expansion中的说明使用globbing。那是

  

分词后,除非设置了-f选项(参见Set   内置),Bash扫描每个单词的字符'*','?'和'['。   如果出现其中一个字符,则该单词被视为a   模式,并替换为按字母顺序排序的文件名列表   匹配模式(见Pattern Matching)。

mv /mydir/$week\_* /mydir/week$week;
#                ^

或者,使用${ }来定义变量名称的范围:

mv /mydir/${week}_* /mydir/week$week;
#          ^    ^ ^

另一种方法

你只需要一个表达式:

for file in <matching condition>; do
     mv "$file" /another/dir
done

在这种情况下:

for file in ${week}_*; do
   mv "$file" /mydir/week"${week}"/
done

因为${week}_*会扩展为以$week_开头的文件名。

查看示例:

$ touch 23_a
$ touch 23_b
$ touch 23_c
$ touch 24_c
$ d=23
$ echo ${d}*
23_a 23_b 23_c
$ for f in ${d}*; do echo "$f --"; done
23_a --
23_b --
23_c --

答案 1 :(得分:1)

以下是使用find

的另一种选择
week=25 && find /mydir -type f -not -path "/mydir/week*" \
-name "$week*zip" -exec mv {} "/mydir/week$week" \;