week=$(date +%W)
我尝试使用$week
将以mv
开头的文件移动到另一个文件夹。
所以我有一个名为:
的文件25_myfile.zip
开头的数字是一周的数字。所以我想使用mv
从目前所在的目录/mydir/week25/
移动它:
mv /mydir/$week\_.* /mydir/week$week;
但我收到了统计错误。
答案 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" \;