不能使用 $myvar_.* 来 mv 以 $myvar_ 开头的文件

Can't use $myvar_.* to mv files starting with $myvar_

week=$(date +%W)

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

所以我有一个文件名为:

25_myfile.zip

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

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

但是我得到一个统计错误。

问题

当你说

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

您正在使用语法 $var\_.*(如果您不想转义下划线,则为 ${var}_.*)您正在尝试使用 globbing,但失败了,因为您使用了正则表达式语法。

解决方案

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

After word splitting, unless the -f option has been set (see The Set Builtin), Bash scans each word for the characters ‘*’, ‘?’, and ‘[’. If one of these characters appears, then the word is regarded as a pattern, and replaced with an alphabetically sorted list of filenames matching the pattern (see 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 --

下面是使用 find

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