不能使用 $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" \;
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" \;