使用bash for loop、mv和sed重命名多个文件

使用bash for loop、mv和sed重命名多个文件,bash,sed,rename,Bash,Sed,Rename,我的目标是通过迭代每个文件名并使用sed根据字符位置执行替换,将格式为“img_MM-DD-YY_XX.jpg”的文件文件夹重命名为格式为“newyears_YYYY-MM-DD_XXX.jpg”。不幸的是,我似乎无法让基于职位的互换发挥作用 e、 g.s/{4\}[0-9][0-9]/.{10\}[0-9][0-9]/试图用YY替换MM 以下是我的尝试(暂时忽略XX部分): 有没有办法解决这个问题 $ echo 'img_11-22-14_XX.jpg' | sed -r 's/[^_]*_(

我的目标是通过迭代每个文件名并使用sed根据字符位置执行替换,将格式为“img_MM-DD-YY_XX.jpg”的文件文件夹重命名为格式为“newyears_YYYY-MM-DD_XXX.jpg”。不幸的是,我似乎无法让基于职位的互换发挥作用

e、 g.
s/{4\}[0-9][0-9]/.{10\}[0-9][0-9]/
试图用YY替换MM

以下是我的尝试(暂时忽略XX部分):

有没有办法解决这个问题

$ echo 'img_11-22-14_XX.jpg' | sed -r 's/[^_]*_([0-9]{2})-([0-9]{2})-([0-9]{2})/newyears_20\3-\1-\2/'
newyears_2014-11-22_XX.jpg
上面的内容将查找第一条下划线后接6位日期的内容。它将初始部分替换为
新年
,并将日期从年月日重新设置为20yy-mm-dd

两位数的mm、dd或yy值与
([0-9]{2})
匹配。括号表示
sed
应捕获该值以供以后使用。替换的输出端是
\u 20\3-\1-\2
。这将恢复下划线,并在年初添加一个
20
。年份是第三个捕获值,因此表示为
\3
。同样,月份是第一个捕获的值,因此表示为
\1
,第二天是
\2

为了消除一些黑斜杠,我使用
-r
选项调用扩展正则表达式。如果您在Mac或其他非GNU系统上,请使用
sed-E
代替
sed-r
。否则,请使用:

sed  's/[^_]*_\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/newyears_20\3-\1-\2/'

这对于
awk

echo "img_MM-DD-YY_XX.jpg"  | awk -F"[_-]" '{print "newyears_20"$4"-"$2"-"$3"_0"$5}'
newyears_20YY-MM-DD_0XX.jpg

使用
awk
而不是
sed
可能会更幸运。您应该使用zsh-
zmv'img_(?)-(?)-(?).jpg''newyears_20;20$3-$2-$1_0$4.jpg'
echo "img_MM-DD-YY_XX.jpg"  | awk -F"[_-]" '{print "newyears_20"$4"-"$2"-"$3"_0"$5}'
newyears_20YY-MM-DD_0XX.jpg