[英]Rename multiple files with bash for loop, mv, and sed
我的目标是通过迭代每个文件名并使用sed根据字符位置进行替换,将格式为'img_MM-DD-YY_XX.jpg'的文件文件夹重命名为格式为'newyears_YYYY-MM-DD_XXX.jpg'。 不幸的是,我似乎无法使基于职位的调换工作。
例如s/.\\{4\\}[0-9][0-9]/.\\{10\\}[0-9][0-9]/
尝试将MM替换为YY
这是我的尝试(现在忽略_XX部分):
for filename in images/*
do
newname=$(echo $filename | sed 's/.\{4\}[0-9][0-9]/.\{10\}[0-9][0-9]/;
s/.\{7\}[0-9][0-9]/.\{4\}[0-9][0-9]/;
s/.\{10\}[0-9][0-9]/.\{7\}[0-9][0-9]/;
s/img_/newyears_20/')
mv $filename $newname
done
有什么想法我可以解决这个问题吗?
$ 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位数的日期。 它用newyears_
代替了初始部分,并将日期格式从mm-dd-yy更改为20yy-mm-dd。
两位的mm,dd或yy值与([0-9]{2})
匹配。 括号表示sed
应该捕获该值以备后用。 替代的输出端是_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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.